右键菜单功能存在于各个地方,其功能也是非常的多,方便用户操作。例如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("根节点");
}