Я придумал решение для TreeView, которое использует обратный вызов OnContextMenuOpening. Это предотвращает проблему, о которой говорил Алекс Г. Если вы свернете меню в стиле XAML, то оно не появится, когда контекстное меню пустое, однако впоследствии оно появится, когда вы щелкнете левой кнопкой мыши по другому элементу.
Код ищет TreeViewItem, который хочет открыть ContextMenu, и, если у него нет элементов, он устанавливает для свойства Handled события значение true.
protected override void OnContextMenuOpening(ContextMenuEventArgs e) {
var item = FindTreeViewItem(e.OriginalSource as DependencyObject);
var contextMenu = item.ContextMenu;
if (contextMenu != null && !contextMenu.HasItems) {
e.Handled = true;
}
}
private TreeViewItem FindTreeViewItem(DependencyObject dependencyObject) {
if (dependencyObject == null) {
return null;
}
var treeViewItem = dependencyObject as TreeViewItem;
if (treeViewItem != null) {
return treeViewItem;
}
return FindTreeViewItem(VisualTreeHelper.GetParent(dependencyObject));
}