如何自己编写网站,网上装修平台哪个最好,软件开发流程八个步骤概要分析,做网络维护的公司有哪些在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.ItemContainerStyle Style TargetType{x:Type TreeViewItem} EventSetter EventTreeViewItem.PreviewMouseRightButtonDown HandlerTreeViewItem_PreviewMouseRightButtonDown/ /Style/TreeView.ItemContainerStyle 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;} 现在才是一个比较完美的解决方案。 转载于:https://www.cnblogs.com/TianFang/archive/2010/02/10/1667153.html