TreeView
<pre><code class="language-csharp">&lt;TreeView x:Name=&quot;Mytreeview&quot;&gt;
&lt;TreeViewItem&gt;
&lt;TreeViewItem.Header&gt;
&lt;StackPanel Orientation=&quot;Horizontal&quot;&gt;
&lt;Image Source=&quot;image/1.png&quot;&gt;&lt;/Image&gt;
&lt;TextBlock Text=&quot;12332&quot;&gt;&lt;/TextBlock&gt;
&lt;/StackPanel&gt;
&lt;/TreeViewItem.Header&gt;
&lt;TreeViewItem Header=&quot;123&quot;&gt;&lt;/TreeViewItem&gt;
&lt;TreeViewItem Header=&quot;456&quot;&gt;
&lt;TreeViewItem Header=&quot;789&quot;&gt;&lt;/TreeViewItem&gt;
&lt;/TreeViewItem&gt;
&lt;/TreeViewItem&gt;
&lt;TreeViewItem Header=&quot;Emp&quot; IsSelected=&quot;True&quot;&gt;
&lt;TreeViewItem Header=&quot;123&quot;&gt;&lt;/TreeViewItem&gt;
&lt;TreeViewItem Header=&quot;456&quot;&gt;
&lt;TreeViewItem Header=&quot;789&quot;&gt;&lt;/TreeViewItem&gt;
&lt;/TreeViewItem&gt;
&lt;/TreeViewItem&gt;
&lt;TreeViewItem Header=&quot;Empsss&quot;&gt;
&lt;TreeViewItem Header=&quot;123&quot;&gt;&lt;/TreeViewItem&gt;
&lt;TreeViewItem Header=&quot;456&quot;&gt;
&lt;TreeViewItem Header=&quot;789&quot;&gt;&lt;/TreeViewItem&gt;
&lt;/TreeViewItem&gt;
&lt;/TreeViewItem&gt;
&lt;/TreeView&gt;
&lt;TreeView Name=&quot;treeviews&quot; PreviewMouseRightButtonDown=&quot;treeviews_PreviewMouseRightButtonDown&quot;&gt;
&lt;TreeView.ItemTemplate&gt;
&lt;HierarchicalDataTemplate ItemsSource=&quot;{Binding Children}&quot;&gt;
&lt;TextBlock Text=&quot;{Binding Name}&quot; /&gt;
&lt;/HierarchicalDataTemplate&gt;
&lt;/TreeView.ItemTemplate&gt;
&lt;/TreeView&gt;
/// &lt;summary&gt;
/// TreeView.xaml 的交互逻辑
/// &lt;/summary&gt;
public partial class TreeView : Window
{
public TreeView()
{
InitializeComponent();
var _men = new List&lt;TreeViewNode&gt;()
{
new TreeViewNode { Id = 1, Name = &quot;根目录&quot;, ParenId = 0 },
new TreeViewNode { Id = 2, Name = &quot;财务管理&quot;, ParenId = 1 },
new TreeViewNode { Id = 4, Name = &quot;教学管理&quot;, ParenId = 2 },
new TreeViewNode { Id = 5, Name = &quot;数据统计&quot;, ParenId = 2 },
new TreeViewNode { Id = 6, Name = &quot;订单管理&quot;, ParenId = 2 },
new TreeViewNode { Id = 7, Name = &quot;结算管理&quot;, ParenId = 2 },
new TreeViewNode { Id = 8, Name = &quot;课程管理&quot;, ParenId = 2 },
new TreeViewNode { Id = 40, Name = &quot;作业管理&quot;, ParenId = 1 },
new TreeViewNode { Id = 41, Name = &quot;课程数据&quot;, ParenId = 40 },
new TreeViewNode { Id = 42, Name = &quot;粉丝数据&quot;, ParenId = 40 }
};
var treeNodes = BuildTree(_men);
treeviews.ItemsSource = treeNodes;
}
private void treeviews_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs&lt;object&gt; e)
{
var selectvalue = (treeviews.SelectedValue as TreeViewItem).Tag as TreeViewNode;
var selectitem = (treeviews.SelectedItem as TreeViewItem).Tag as TreeViewNode;
}
private List&lt;TreeViewNode&gt; BuildTree(List&lt;TreeViewNode&gt; nodes, int parentId = 0)
{
return nodes
.Where(n =&gt; n.ParenId == parentId)
.Select(n =&gt; new TreeViewNode
{
Id = n.Id,
Name = n.Name,
ParenId = n.ParenId,
Children = BuildTree(nodes, n.Id)
})
.ToList();
}
private void treeviews_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
DependencyObject source = e.OriginalSource as DependencyObject;
while (source != null &amp;&amp; !(source is TreeViewItem))
{
source = VisualTreeHelper.GetParent(source);
}
if (source != null)
{
TreeViewItem item = source as TreeViewItem;
if (item != null)
{
item.Focus(); // 设置焦点以确保该项被选中
CreateContextMenu(item);
e.Handled = true; // 标记事件已处理
}
}
}
private void CreateContextMenu(TreeViewItem item)
{
// 获取TreeViewItem绑定的数据对象
var data = item.DataContext as TreeViewNode;
if (data != null)
{
// 创建上下文菜单
ContextMenu contextMenu = new ContextMenu();
// 添加菜单项并为其注册事件处理程序
MenuItem menuItem1 = new MenuItem { Header = &quot;选项 1&quot; };
menuItem1.Click += (s, e) =&gt; MessageBox.Show($&quot;选项 1 被点击,数据: {data.Name}&quot;);
contextMenu.Items.Add(menuItem1);
MenuItem menuItem2 = new MenuItem { Header = &quot;选项 2&quot; };
menuItem2.Click += (s, e) =&gt; MessageBox.Show($&quot;选项 2 被点击,数据: {data.Name}&quot;);
contextMenu.Items.Add(menuItem2);
// 将上下文菜单分配给TreeViewItem并显示
item.ContextMenu = contextMenu;
contextMenu.IsOpen = true;
}
}
/// &lt;summary&gt;
/// 根节点功能
/// &lt;/summary&gt;
/// &lt;param name=&quot;sender&quot;&gt;&lt;/param&gt;
/// &lt;param name=&quot;e&quot;&gt;&lt;/param&gt;
private void MenuItem_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(&quot;根节点&quot;);
}
}</code></pre>