WPF中TreeView设置右键菜单

博客指出右键菜单功能多但易致误操作,重点讲解给TreeView设置右键菜单的方法。一是在xaml文件中直接创建ContextMenu并绑定点击事件;二是在代码中动态设置,需注册PreviewMouseRightButtonDown事件判断鼠标落点,还给出了xaml和.cs文件代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

     右键菜单功能存在于各个地方,其功能也是非常的多,方便用户操作。例如Windows桌面的菜单:

   但是有时候过多的右键菜单功能又容易导致用户的误操作,下面讲解给TreeView设置右键菜单,首先在xaml文件中设置一棵树:

  1、最直观的方式是直接在页面上创建ContextMenu,并在页面初始化时绑定点击事件:

                                     

     2、当树的每一级节点都有它自己的专属功能时,上面的菜单设置就不是那么好用了; 那么下面就来实现如何代码中动态设置右键菜单功能:

    既然需要为各级节点设置专属事件,那就需要判断鼠标究竟是落在哪一级节点了,这就需要注册一个PreviewMouseRightButtonDown事件:

xaml代码:

.cs文件代码:

/// <summary>
/// 右键事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void TView_PreviewMouseRightButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
    DependencyObject source = e.OriginalSource as DependencyObject;
    while (source != null && source.GetType() != typeof(TreeViewItem))
        source = System.Windows.Media.VisualTreeHelper.GetParent(source);
    if (source != null)
    {
        TreeViewItem item = source as TreeViewItem;
        CreateContextMenu(item.Header);
    }
}

/// <summary>
/// 显示菜单
/// </summary>
/// <param name="positionItem"></param>
private void CreateContextMenu(object positionItem)
{
    ContextMenu contextMenu = new ContextMenu();
    MenuItem menuItem = new MenuItem();
    menuItem.Header = "刷新";
    menuItem.Click += (sender, e) => { MessageBox.Show("刷新"); };
    contextMenu.Items.Add(menuItem);
    if (positionItem.Equals("根节点"))
    {
        menuItem = new MenuItem();
        menuItem.Header = "根节点功能";
        menuItem.Click += MenuItem_Click;
        contextMenu.Items.Add(menuItem);
    }
    else if (positionItem.Equals("一级节点"))
    {
        menuItem = new MenuItem();
        menuItem.Header = "一级节点功能";
        menuItem.Click += new RoutedEventHandler((sender, e) => { MessageBox.Show("一级节点功能"); });
        contextMenu.Items.Add(menuItem);
    }
    else if (positionItem.Equals("二级节点"))
    {
        menuItem = new MenuItem();
        menuItem.Header = "二级节点功能";
        menuItem.Click += delegate { MessageBox.Show("二级节点功能"); };
        contextMenu.Items.Add(menuItem);
    }

    this.tView.ContextMenu = contextMenu;
}

/// <summary>
/// 根节点功能
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show("根节点");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值