我正在開發 C# 桌面應用程式,并且正在尋找一種以編程方式突出顯示/選擇 a 的方法MenuItem,我遇到了這個建議:https ://stackoverflow.com/a/71115000/4247806
這看起來不錯,但我的選單是通過系結ItemsSource到ICommand類串列來填充的,而不是在 Xaml 標記中顯式地填充。MenuItem因此 WPF 在幕后創建所需的實體。如何讓 ContextMenu 使用我的自定義 MenuItem 類?
在以前的自定義作業中,DataGrid我偶然發現了該類也具有的GetContainerForItemOverride方法。ContextMenu這導致我采用這種方法:
public class MyContextMenu : ContextMenu
{
protected override DependencyObject GetContainerForItemOverride()
{
return new MyMenuItem();
}
}
public class MyMenuItem : MenuItem
{
public MyMenuItem()
{
}
public new bool IsHighlighted
{
get => base.IsHighlighted;
set => base.IsHighlighted = value;
}
}
但是,我想完全模仿/模仿原始行為,除了我需要一個MyMenuItem實體。查看ContextMenu.GetContainerForItemOverride我發現的實作:
protected override DependencyObject GetContainerForItemOverride()
{
object currentItem = _currentItem;
_currentItem = null;
if (UsesItemContainerTemplate)
{
DataTemplate dataTemplate = ItemContainerTemplateSelector.SelectTemplate(currentItem, this);
if (dataTemplate != null)
{
object obj = dataTemplate.LoadContent();
if (obj is MenuItem || obj is Separator)
{
return obj as DependencyObject;
}
throw new InvalidOperationException(SR.Get("InvalidItemContainer", GetType().Name, typeof(MenuItem).Name, typeof(Separator).Name, obj));
}
}
return new MenuItem();
}
private object _currentItem由于正在使用,我無法重現此行為。如果我忽略這一點,在哪些情況下會導致問題?
uj5u.com熱心網友回復:
如果您查看源代碼,您會發現私有欄位_currentItem僅在兩種方法中使用,因此您可以輕松地在自定義中復制此代碼,如果您想要的話,MyContextMenu只需將型別從更改為MenuItem:MyMenuItem
private object _currentItem;
protected override bool IsItemItsOwnContainerOverride(object item)
{
bool ret = (item is MenuItem) || (item is Separator);
if (!ret)
{
_currentItem = item;
}
return ret;
}
protected override DependencyObject GetContainerForItemOverride()
{
object currentItem = _currentItem;
_currentItem = null;
if (UsesItemContainerTemplate)
{
DataTemplate itemContainerTemplate = ItemContainerTemplateSelector.SelectTemplate(currentItem, this);
if (itemContainerTemplate != null)
{
object itemContainer = itemContainerTemplate.LoadContent();
if (itemContainer is MenuItem || itemContainer is Separator)
{
return itemContainer as DependencyObject;
}
else
{
throw new InvalidOperationException(SR.Get(SRID.InvalidItemContainer, this.GetType().Name, typeof(MenuItem).Name, typeof(Separator).Name, itemContainer));
}
}
}
return new MenuItem();
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/521352.html
標籤:C#wpf捆绑
