c# - 为 TreeView 和 TreeViewItem 触发的 ContextMenuOpening 事件

标签 c# wpf treeview

我的应用程序使用 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 上具有相同的功能(右键单击 TreeView 的空白区域时 TreeView 特定的上下文菜单),这也有效。

private void TreeNodes_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        TreeView tw = sender as TreeView;
        ContextMenu menu = tw.ContextMenu;
        menu.Items.Clear();
        // poopulate menu there
    }

但问题是 TreeNodes_ContextMenuOpening 甚至在右击 TreeView 节点后,在 Node_ContextMenuOpening 被处理后立即触发,这会覆盖点击节点的上下文菜单。我尝试使用以下方法解决它:

 // also tried IsMouseOver and IsMouseCaptureWithin
 if (tw.IsMouseDirectlyOver)
        {
            // handle TreeNodes_ContextMenuOpening event there
        }

但没有成功。有什么建议么? 提前致谢。

最佳答案

您可以尝试使用 ContextMenuEventArgs.Handled 值。 https://learn.microsoft.com/en-us/dotnet/api/system.windows.routedeventargs.handled?view=netcore-3.1#System_Windows_RoutedEventArgs_Handled

Gets or sets a value that indicates the present state of the event handling for a routed event as it travels the route.

例子

protected override void OnPreviewMouseRightButtonDown(System.Windows.Input.MouseButtonEventArgs e)
{
    e.Handled = true; //suppress the click event and other leftmousebuttondown responders
    MyEditContainer ec = (MyEditContainer)e.Source;
    if (ec.EditState)
    { ec.EditState = false; }
    else
    { ec.EditState = true; }
    base.OnPreviewMouseRightButtonDown(e);
}

关于c# - 为 TreeView 和 TreeViewItem 触发的 ContextMenuOpening 事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63533615/

相关文章:

c# - C# COM DLL 中的 ManagementObject 泄漏

c# - 如何将 AlertDialog 与 mvvmcross 集成

c# - 从父对象创建子对象实例的最佳方法

c# - 如何设置TreeView控件的背景图片? (VS 2008/.Net 3.5/C#/WinForms)

c# - 有没有可能 DbContext.SaveChanges() 返回 0 但没有异常?

.net - wpf绑定(bind)事件发生在窗口关闭之后

wpf - 绑定(bind) OnwayToSource 未按预期工作 - 有什么替代方案?

.net - ItemContainerGenerator.ContainerFromItem 如何使用分组列表?

python - Tk TreeView 焦点()。如何获取多条选中的行?

具有多选的 WPF TreeView