在WPF的TreeView中实现右键选定
来源:互联网 发布:模具分析软件 编辑:程序博客网 时间:2024/06/09 20:51
在WPF中,TreeView默认情况是不支持右键选定的,也就是说,当右键点击某节点时,是无法选中该节点的。当我们想在TreeViewItem中实现右键菜单时,往往希望在弹出菜单的同时选中该节点,以使得菜单针对选中的节点生效。
图1:虽然是在GNU节点上弹出的右键菜单,但选中的节点仍然是上次左键单击的DOC节点。
图2:弹出的右键菜单同时选中GNU节点才是我们所需要的效果
实现这个功能并不是很难,我最开始的做法就是目前网上流行的版本:
- 在TreeViewItem中响应PreviewMouseRightButtonDown事件
- 在响应右键单击事件前选中sender(TreeViewItem)节点。
privatevoid 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 Event="TreeViewItem.PreviewMouseRightButtonDown" Handler="TreeViewItem_PreviewMouseRightButtonDown"/>
</Style>
</TreeView.ItemContainerStyle>
2. 在响应右键单击事件前选中TreeViewItem节点。
privatevoid TreeViewItem_PreviewMouseRightButtonDown(object sender,MouseButtonEventArgs e)
{
var treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSourceas DependencyObject)as TreeViewItem;
if (treeViewItem != null)
{
treeViewItem.Focus();
e.Handled = true;
}
}staticDependencyObject VisualUpwardSearch<T>(DependencyObject source)
{
while (source != null && source.GetType() !=typeof(T))
source = VisualTreeHelper.GetParent(source);
return source;
}
现在才是一个比较完美的解决方案。
- 在WPF的TreeView中实现右键选定
- 在WPF的TreeView中实现右键选定
- WPF的TreeView中实现右键选定
- WPF右键treeview控件并选定选项
- WPF 中TreeView 右键选中实现
- 【WPF】如何让TreeView实现右键选中的功能
- Qt中TreeView的右键菜单实现
- WPF中一个比较完整的树形结构<TreeView>和右键菜单<ContextMenu>
- WPF中TreeView的使用
- WPF中TreeView的使用
- WPF中TreeView的使用
- 在TreeView中增加右键菜单功能
- TreeView控件的CheckBox自动实现父子节点递归选定
- 获得treeview选定的文本
- vs中DataGridView右键选定行的问题
- 采用MVVM方式实现WPF的TreeView
- wpf实现metrol风格的Treeview样式
- WPF的Treeview控件实现CheckBox
- Github 教程
- windows 环境下Eclipse开发MapReduce环境设置
- Spring Aop详尽教程
- Android之AsyncTask异步任务——防止内存泄露
- Codeforces 629 D Finals in arithmetic(最大上升子序列和,O(nlogn)、线段树/树状数组)
- 在WPF的TreeView中实现右键选定
- UVa 11478 Halum BellmanFord判负权环
- 欢迎使用CSDN-markdown编辑器
- nyoj 1070 诡异的电梯【Ⅰ】 动态规划
- 说起Android的Binder,我们都能说些什么?
- 新空间RecycleView复习
- ViewPager嵌套Fragment实现item实时更新的两种方式
- 字符串反转(reverse函数)
- 给UICollectionView添加表头