Я создал контекстное меню, которое я (на данный момент) использую для некоторых элементов в своем древовидной структуре. Для этого я создал TreeItem
класс, который содержит всю необходимую информацию, как заголовок, значок, дети, выполнить целевые и т.д. Это то, что он выглядит следующим образом:Контекстное меню повторного использования
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"
Visibility="{Binding ShowContextMenu}"
ItemsSource="{Binding ContextMenu}">
<ContextMenu.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Header}" />
<HierarchicalDataTemplate.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command"
Value="{Binding Execute}" />
<Setter Property="Icon"
Value="{StaticResource cmIcon}" />
<Setter Property="ToolTip"
Value="{Binding ToolTip}" />
</Style>
</HierarchicalDataTemplate.ItemContainerStyle>
</HierarchicalDataTemplate>
</ContextMenu.ItemTemplate>
<ContextMenu.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Command"
Value="{Binding Execute}" />
<Setter Property="Icon"
Value="{StaticResource cmIcon}" />
<Setter Property="ToolTip"
Value="{Binding ToolTip}" />
</Style>
</ContextMenu.ItemContainerStyle>
</ContextMenu>
Когда я использовал контекстное меню только в дереве view, он был прикреплен к TextBlock в ItemTemplate. Но теперь я хочу использовать одно и то же контекстное меню для другого элемента управления. Поскольку я не хочу копировать один и тот же код в другое место и поддерживать его несколько раз, я хочу повторно использовать его в качестве шаблона. Я попробовал 2 вещи:
Я положил контекстное меню ресурсов пользовательского элемента управления (только для тестирования) и назовем это так:
<TextBlock Text="{Binding Header}" ContextMenu="{StaticResource myContextMenu}">
. Он будет отображаться, но не закрываться и не перемещаться. Кроме того, это не очень полезно в любом случае, поскольку я хочу использовать контекстное меню для другого пользовательского элемента управления.Затем я разместил контекстное меню внутри шаблона управления в App.xaml:
<ControlTemplate x:Key="TreeContextMenu" TargetType="ContextMenu">
. И я называю это так:<TextBlock.ContextMenu> <ContextMenu Template="{StaticResource TreeContextMenu}"/> </TextBlock.ContextMenu>
Программа запускается, но когда я хочу, чтобы открыть контекстное меню, я получаю исключение: 'ContextMenu' cannot have a logical or visual parent.
Я пытался Google для решения, но не нашел ничего полезного.
Но у меня все еще есть та же проблема, что и контекстное меню не будет закрываться снова. Это можно устранить, если я удалю атрибут «Видимость». Однако я хочу скрыть все контекстное меню, если оно не содержит никаких элементов. – Peter
Привязка контекстного меню к TreeViewItem вместо текстового блока должно решить вашу проблему. – Jan