首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为TreeView和TreeViewItem触发的TreeView事件

为TreeView和TreeViewItem触发的TreeView事件
EN

Stack Overflow用户
提问于 2020-08-22 07:23:20
回答 1查看 157关注 0票数 3

我的应用程序使用TreeView填充TreeView.ItemTemplate中定义的自定义节点。每个节点的内容被包装到StackPanel中,Node_ContexMenuOpening事件基于某些应用程序属性填充上下文菜单,该应用程序正在工作。

XAML:

代码语言:javascript
复制
<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>

代码背后:

代码语言:javascript
复制
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的空区域时)有同样的功能,这也是有效的。

代码语言:javascript
复制
private void TreeNodes_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        TreeView tw = sender as TreeView;
        ContextMenu menu = tw.ContextMenu;
        menu.Items.Clear();
        // poopulate menu there
    }

但问题是,即使在右键单击TreeView节点之后,也会触发TreeView,这是在处理Node_ContextMenuOpening之后触发的,后者覆盖了单击节点的上下文菜单。我试图用以下方法解决这个问题:

代码语言:javascript
复制
 // also tried IsMouseOver and IsMouseCaptureWithin
 if (tw.IsMouseDirectlyOver)
        {
            // handle TreeNodes_ContextMenuOpening event there
        }

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-22 08:57:17

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

获取或设置一个值,该值指示路由事件在路由过程中处理事件的当前状态。

示例

代码语言:javascript
复制
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);
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63533615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档