我需要在运行时创建ContextMenu
的结构,因为菜单MenuItem
的存在是基于许多因素的。我尝试以这种方式向ContextMenuOpening
事件添加处理程序:
XAML
<TreeView x:Name="ArticlesTreeView" Grid.Column="0" AllowDrop="True">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="ContextMenuService.ShowOnDisabled" Value="True" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu Opened="ContextMenu_OnOpened">
<MenuItem Header="First item"></MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
此代码会在XamlParseException
行引发<ContextMenu Opened="ContextMenu_OnOpened">
。我可以用其他方式解决问题吗?
UPD 我发现对我来说,不是ContextMenuOpening
和Opened
事件。我纠正了上层代码。
答案 0 :(得分:2)
尝试在树视图的ItemTemplate上创建ContextMenu。试试下面的代码(它不完整,但我希望你能得到这个想法)
<TreeView .....>
<TreeView.ItemTemplate>
<DataTemplate>
<ContentControl>
<ContentControl.ContextMenu>
<ContextMenu ContextMenuOpening="ContextMenu_OnContextMenuOpening">
<MenuItem Header="First item"></MenuItem>
</ContextMenu>
</ContentControl.ContextMenu>
---------Your Item Template here
</ContentControl>
</DataTemplate>
</TreeView.ItemTemplate>
</TreeView>
答案 1 :(得分:0)
您的问题已经回答here。
在事件设置器中放置事件处理程序可以完成工作。
<TreeView x:Name="ArticlesTreeView" AllowDrop="True">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="ContextMenuService.ShowOnDisabled" Value="True" />
<Setter Property="ContextMenu">
<Setter.Value>
<ContextMenu>
<MenuItem Header="First item">
<MenuItem.Style>
<Style TargetType="MenuItem">
<EventSetter Event="Click" Handler="ContextMenu_ContextMenuOpening_1"></EventSetter>
</Style>
</MenuItem.Style>
</MenuItem>
</ContextMenu>
</Setter.Value>
</Setter>
</Style>
</TreeView.ItemContainerStyle>
<TreeViewItem>
</TreeViewItem>
</TreeView>
还将事件处理程序后面的代码更改为
private void ContextMenu_ContextMenuOpening_1(object sender, RoutedEventArgs e)
{
}