我的应用程序使用TreeView
,它填充了在TreeView.ItemTemplate
中定义的自定义节点。每个节点的内容被包装进一个StackPanel
中,并带有Node_ContexMenuOpening
事件,该事件基于一些应用程序属性填充上下文菜单,这是有效的。
XAML:
<TreeView x:Name="treeNodes" ContextMenu="{StaticResource EmptyContextMenu}" ContextMenuOpening="TreeNodes_ContextMenuOpening">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type c:MyCustomType}" ItemsSource="{Binding MyCustomTypeChildren}">
<StackPanel Orientation="Horizontal" ContextMenu="{StaticResource EmptyContextMenu}" ContextMenuOpening="Node_ContextMenuOpening" >
<Image Source="Frontend\Images\import.png" MaxWidth="15" MaxHeight="15"/>
<TextBlock Width="5"/>
<TextBlock Text="{Binding CustomTypeName}" MinWidth="100"/>
<TextBlock Width="10"/>
<Image Source="CustomImagePath" MaxWidth="15" MaxHeight="15"/>
<TextBlock Width="5"/>
<TextBlock Text="{Binding CustomTypeName2}"/>
</StackPanel>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
代码后台:
private void Node_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
FrameworkElement fe = sender as FrameworkElement;
// get context menu and clear all items (empty menu with single placeholder item
// is assigned in XAML to prevent "no object instance" exception)
ContextMenu menu = fe.ContextMenu;
menu.Items.Clear();
// populate menu there
}
我希望在TreeView上实现相同的功能(右键单击树视图的空白区域时显示特定的上下文菜单),并且使其正常工作。
private void TreeNodes_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
TreeView tw = sender as TreeView;
ContextMenu menu = tw.ContextMenu;
menu.Items.Clear();
// poopulate menu there
}
但问题在于,即使在右键单击TreeView节点后处理了Node_ContextMenuOpening
,TreeNodes_ContextMenuOpening
仍会触发,覆盖了所单击的节点的上下文菜单。我尝试使用以下方法解决:
// also tried IsMouseOver and IsMouseCaptureWithin
if (tw.IsMouseDirectlyOver)
{
// handle TreeNodes_ContextMenuOpening event there
}
但一直没有成功。 有什么建议吗? 提前感谢。
ElementName.ContextMenu.IsOpen = true;
解决了这个问题。 - Zoltán Dolenský