十字星

  • 首页
  • 技术
  • 随笔
  • 瞎折腾
  • 平面设计
  • 文集
  • 留言
  1. 首页
  2. 技术
  3. 正文

WPF中TreeView设置鼠标右键菜单

2019-09-30 295点热度 1人点赞 0条评论

1.设置TreeView对象,代码

<Window x:Class="WpfApp1.Window1" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
        xmlns:local="clr-namespace:WpfApp1" 
        mc:Ignorable="d" Title="Window1" Height="450" Width="800">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
            <ColumnDefinition/>
        </Grid.ColumnDefinitions>
        <TreeView x:Name="treeView" PreviewMouseRightButtonDown="TreeView_PreviewMouseRightButtonDown">
            <TreeViewItem Header="节点1" Name="node1"/>
            <TreeViewItem Header="节点2" Name="node2" IsExpanded="True">
                <TreeViewItem Header="[节点2[一级子菜单1" Name="node21"/>
                <TreeViewItem Header="[节点2]一级子菜单2" Name="node22">
                    <TreeViewItem Header="{}{[节点2]一级子菜单2}二级子菜单1" Name="node221"/>
                    <TreeViewItem Header="{}{[节点2]一级子菜单2}二级子菜单2" Name="node222"/>
                </TreeViewItem>
                <TreeViewItem Header="[节点2]一级子菜单3" Name="node23"/>
                <TreeViewItem Header="[节点2]一级子菜单4" Name="node24"/>
            </TreeViewItem>
        </TreeView>
        <GridSplitter Width="5" Background="#FF3768EA"></GridSplitter>
    </Grid>
</Window>

界面预览

2.菜单注册事件为 PreviewMouseRightButtonDown事件,事件代码如下

using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;

namespace WpfApp1
{
    /// <summary>
    /// Window1.xaml 的交互逻辑
    /// </summary>
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void TreeView_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
        {
            var treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
            if (treeViewItem != null)
            {
                treeViewItem.Focus();
                e.Handled = true;

                ContextMenu contextMenu = new ContextMenu();
                MenuItem menuItem = new MenuItem() { Header = treeViewItem.Header };
                menuItem.Click += delegate { MessageBox.Show("右键菜单,选中节点为[" + treeViewItem.Header + "]"); };
                contextMenu.Items.Add(menuItem);

                if (treeViewItem.Name == "node221")
                {
                    menuItem = new MenuItem() { Header = treeViewItem.Header + "专用功能" };
                    menuItem.Click += delegate { MessageBox.Show("专用功能,\r\n\r\n选中节点为[" + treeViewItem.Header + "]"); };
                    contextMenu.Items.Add(menuItem);
                }
                else if (treeViewItem.Name == "node21")
                {
                    menuItem = new MenuItem() { Header = treeViewItem.Header + "专用右键菜单" };
                    menuItem.Click += delegate { MessageBox.Show("专用右键菜单,\r\n\r\n选中节点为[" + treeViewItem.Header + "]"); };
                    contextMenu.Items.Add(menuItem);
                }

                this.treeView.ContextMenu = contextMenu;

            }
        }

        static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
        {
            while (source != null && source.GetType() != typeof(T))
                source = VisualTreeHelper.GetParent(source);

            return source;
        }
    }
}

3.运行结果

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可
标签: C# TreeView WPF
最后更新:2019-09-30

cxw

技术宅,最喜瞎折腾.

点赞
< 上一篇
下一篇 >

文章评论

取消回复

最新 热点 随机
最新 热点 随机
删除名称最后带空格的文件夹 esxi无法直通sata控制器,只能使用rdm直通硬盘 Esxi总是会话超时需要重新登录,修改配置,增加超时时间 WinAPI函数SetupDiEnumDeviceInterfaces始终返回false解决方案 删除tmp文件夹内容导致网站503 Service Unavailable解决 SQL Server 附加数据库出错,操作系统错误 5:"5(拒绝访问。)" 错误:5120
删除tmp文件夹内容导致网站503 Service Unavailable解决esxi无法直通sata控制器,只能使用rdm直通硬盘WinAPI函数SetupDiEnumDeviceInterfaces始终返回false解决方案Esxi总是会话超时需要重新登录,修改配置,增加超时时间删除名称最后带空格的文件夹
C# 获取this.Handle时异常"创建窗口句柄时出错",其中一种原因 centos系统下使用yum update报错:error: rpmdb: BDB0113 Thread/process 4001610/139762934704000 failed: BDB1507 Thread died in Berkeley DB library esxi无法直通sata控制器,只能使用rdm直通硬盘 朱安 WordPress文章阅读量统计和显示(非插件,刷新页面不累加) 管理员收不到普通权限的SendMessage消息
标签聚合
CentOS C# WinForm WordPress Linux PHP IT Excel Hyper-V W10
最近评论
alex 发布于 1 年前(01月22日) 博主,请问把代码贴到博客里可以复制是怎么实现的

COPYRIGHT © 2021 十字星. ALL RIGHTS RESERVED

THEME KRATOS MADE BY VTROIS

京ICP备2020032489号-1