在显示上下文菜单之前,通过右键单击选择 TreeView 节点。

7 浏览
0 Comments

在显示上下文菜单之前,通过右键单击选择 TreeView 节点。

我想在右键单击时,在显示ContextMenu之前选择WPF TreeView节点。\n对于WinForms,我可以使用类似于Find node clicked under context menu的代码,那么在WPF中有哪些替代方法呢?

0
0 Comments

问题的原因是使用"item.Focus();"无法完全选择TreeView节点,但使用"item.IsSelected = true;"可以解决该问题。以下是一些用户的评论:

评论1:感谢这个提示,帮助了我。

评论2:好的提示。我首先调用Focus(),然后设置IsSelected为true。

解决方法:使用"item.IsSelected = true;"来选择TreeView节点。以下是代码示例:

item.IsSelected = true;

这个方法可以确保TreeView节点被正确选择,并在右键点击之前被高亮显示。希望这个解决方法对你有帮助!

0
0 Comments

问题的出现原因:用户想要在右键单击TreeView节点之前选中该节点。

解决方法:可以使用Blend Interactivity来实现。

首先,假设TreeView是通过数据绑定到一个层级的视图模型集合的,该视图模型具有一个名为IsSelected的布尔属性和一个名为Name的字符串属性,以及一个名为Children的子项集合。

接下来,在XAML中设置TreeView的ItemContainerStyle,将TreeViewItem的IsSelected属性绑定到视图模型的IsSelected属性,并设置为双向绑定。

然后,使用HierarchicalDataTemplate来设置TreeView的ItemTemplate,将TextBlock的Text属性绑定到视图模型的Name属性。在TextBlock上使用Blend Interactivity的EventTrigger来响应PreviewMouseRightButtonDown事件,并使用ChangePropertyAction来将视图模型的IsSelected属性设置为true。

最后,通过使用NuGet包Unofficial.Blend.Interactivity来获取Blend Interactivity功能。

文章内容如下:

如果您想要一个仅使用XAML的解决方案,可以使用Blend Interactivity。

假设TreeView通过数据绑定到一个具有IsSelected布尔属性和Name字符串属性以及名为Children的子项集合的视图模型的层级集合。


  
    
  
  
    
      
        
          
            
          
        
      
    
  

其中有两个有趣的部分:

1. TreeViewItem的IsSelected属性绑定到视图模型的IsSelected属性。将视图模型的IsSelected属性设置为true将选择树中对应的节点。

2. 当在节点的可视部分(在本示例中是TextBlock)上触发PreviewMouseRightButtonDown事件时,将视图模型的IsSelected属性设置为true。回到第1点,可以看到在树中被点击的对应节点将成为选定节点。

获取Blend Interactivity的一种方法是使用NuGet包Unofficial.Blend.Interactivity。

非常好的答案,谢谢!不过,如果能显示一下i和ei的命名空间映射是如何解析的以及它们所在的程序集,会更有帮助。我假设:xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"和xmlns:ei="http://schemas.microsoft.com/expression/2010/interactions",它们分别位于System.Windows.Interactivity和Microsoft.Expression.Interactions程序集中。

这个解决方法对我没有帮助,因为ChangePropertyAction尝试设置绑定的数据对象的IsSelected属性,而该属性不是UI的一部分,因此它没有IsSelected属性。我做错了什么吗?

Procházka: 我的答案要求您的“数据对象”(或视图模型)具有如我的答案第二段所述的IsSelected属性:假设TreeView通过数据绑定到具有布尔属性IsSelected的层级视图模型集合...(我强调了一下)。

0
0 Comments

问题的出现原因是,根据树的填充方式,发送者(sender)和e.Source的值可能会有所不同。解决方法之一是使用e.OriginalSource,并使用VisualTreeHelper找到TreeViewItem。

private void OnPreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
    TreeViewItem treeViewItem = VisualUpwardSearch(e.OriginalSource as DependencyObject);
    if (treeViewItem != null)
    {
        treeViewItem.Focus();
        e.Handled = true;
    }
}
static TreeViewItem VisualUpwardSearch(DependencyObject source)
{
    while (source != null && !(source is TreeViewItem))
        source = VisualTreeHelper.GetParent(source);
    return source as TreeViewItem;
}

如果右键单击的位置为空,如何取消选择所有内容?

问题的解决方法是,如果treeViewItem为空,则使用以下代码取消选择所有内容:

if (treeViewItem == null) 
    treeView.SelectedIndex = -1;

if (treeViewItem == null) 
    treeView.SelectedItem = null;

此事件处理程序是针对TreeView的。

0