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;
}
}
}

