东莞网站建设乐云seo在线制作,网站内容栏目,做网站后台的时候误删了数据库的表,织梦网站开发视频在WPF中#xff0c;TreeView默认情况是不支持右键选定的#xff0c;也就是说#xff0c;当右键点击某节点时#xff0c;是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时#xff0c;往往希望在弹出菜单的同时选中该节点#xff0c;以使得菜单针对选中的节点生…在WPF中TreeView默认情况是不支持右键选定的也就是说当右键点击某节点时是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时往往希望在弹出菜单的同时选中该节点以使得菜单针对选中的节点生效。 图1虽然是在GNU节点上弹出的右键菜单但选中的节点仍然是上次左键单击的DOC节点。 图2弹出的右键菜单同时选中GNU节点才是我们所需要的效果 
实现这个功能并不是很难我最开始的做法就是目前网上流行的版本 在TreeViewItem中响应PreviewMouseRightButtonDown事件  在响应右键单击事件前选中sender(TreeViewItem)节点。  
private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{var treeViewItem  sender as TreeViewItem;if (treeViewItem ! null){treeViewItem.Focus();e.Handled  true;}
} 
但这样做还存在一个问题当选择子节点时sender并不是子节点的TreeViewItem而是其父节点。导致无法选择选择子节点。如下图所示 要解决这个问题也不难那就是根据MouseButtonEventArgs的OriginalSource来获取节点。但是OriginalSource也不是TreeViewItem而是产生鼠标事件的子控件因此还得往上查找从而找到所属的TreeViewItem。 
最终的解决方案如下 
1. 在TreeViewItem中响应PreviewMouseRightButtonDown事件 
TreeView.ItemContainerStyleStyle TargetType{x:Type TreeViewItem}EventSetter EventTreeViewItem.PreviewMouseRightButtonDown HandlerTreeViewItem_PreviewMouseRightButtonDown//Style
/TreeView.ItemContainerStyle 如果不知道以上代码怎么添加可以在treeview的属性面板上找事件“PreviewMouseRightButtonDown”双击后面的空白处VS会自动添加方法。 
2. 在响应右键单击事件前选中TreeViewItem节点。 
private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{var treeViewItem  VisualUpwardSearchTreeViewItem(e.OriginalSource as DependencyObject) as TreeViewItem;if (treeViewItem ! null){treeViewItem.Focus();e.Handled  true;}
}static DependencyObject VisualUpwardSearchT(DependencyObject source)
{while (source ! null  source.GetType() ! typeof(T))source  VisualTreeHelper.GetParent(source);return source;
} 
现在才是一个比较完美的解决方案。