以"样式"连接处理程序到ContextMenu部分
本文关键字:quot ContextMenu 部分 程序 连接 样式 连接处 处理 | 更新日期: 2023-09-27 18:14:27
我需要在运行时创建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
事件。我改正了上面的代码。
尝试在treeview的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>
你的问题在这里已经有答案了。
将事件处理程序放在事件设置器中完成了工作。
<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)
{
}