WPF展开TreeView单击鼠标

问题描述:

我有一个WPF TreeView与HierarchicalDataTemplate。WPF展开TreeView单击鼠标

目前我必须双击一个项目来展开/折叠它。

我想将此行为更改为单击,而不会失去其他功能。所以它应该在点击时展开和折叠。

这样做的建议方法是什么?

谢谢!

您可以使用重新模板化复选框作为您的节点(包含您当前使用的任何模板),并将其IsChecked属性绑定到TreeViewItem的IsExpanded属性。

这是我刚刚测试,似乎做的工作模板:

<HierarchicalDataTemplate ItemsSource="{Binding Items}"> 
    <CheckBox IsChecked="{Binding RelativeSource={RelativeSource AncestorType=TreeViewItem}, Path=IsExpanded}"> 
     <CheckBox.Template> 
      <ControlTemplate> 
       <TextBlock Text="{Binding Header}"></TextBlock> 
      </ControlTemplate> 
     </CheckBox.Template> 
    </CheckBox> 
</HierarchicalDataTemplate> 

只需更换与任何你需要的控件模板内容。

我很少有WPF工作经验,所以我在这里不是100%的确定。但是,您可能会检出Treeview和TreeView Item的.HitTest方法(WPF Treeview基本上是Windows.Controls.Treeview,是吗?或者派生它?)。

对于标准的Windows.Forms.Treeview(我使用的是VS 2008),直到键入大部分方法名称后,Test方法并不总是自动出现在Intellisense菜单中。但它应该在那里。你可能需要尝试一下。

您可以使用.HitTest方法来处理MouseDown事件并返回对所选树视图项的引用。但是,如果用户在不包含树项目的控件区域中单击,则必须测试空返回值。一旦你有一个特定项目的引用,你应该能够将它的.expanded属性设置为与当前任何内容相反的属性。再次,这里可能需要一些实验。

正如我所说,我还没有实际使用WPF,所以我可能会有这个错误。 。 。

如果您使用的是标准TreeViewItem,那么你就可以捕获点击事件:

private void OnTreeViewMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    var tv = sender as TreeView; 
    var item = tv.SelectedItem as TreeViewItem; 

    if(item != null) 
     item.IsExpanded = !item.IsExpanded; 

    e.Handled = true; 
} 

private void OnTreeViewPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

最有可能在你的情况,你需要与你的绑定和视图模型的东西。这是来自CodePlex的一篇很好的文章:Simplifying the WPF TreeView by Using the ViewModel Pattern

Metro Smurf的答案(感谢我得到了我想要的地方)提出了正确的方法。您可以简单地连接到Treeview的SelectedItemChanged事件。然后将在事件处理程序中传递的e.NewValue转换为TreeViewItem,并访问其IsExpanded属性以将其设置为true。

void MyFavoritesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
{ 
    ((TreeViewItem)e.NewValue).IsExpanded = true; 
} 

然后进行最后的触摸,还可以通过铸造他们为树型视图钩住你的树形目录中的项目的建议,然后你就可以连接到各种操纵事件,如:

var item = tv.SelectedItem as TreeViewItem; 
item.Expanded += item_Expanded; 

然后做任何你需要在事件处理程序做

void item_Expanded(object sender, RoutedEventArgs e) 
{ 
// handle your stuff 
} 

就在下列情况下使用选定的项目更改事件和使用,

private void treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e) 
    { 
     TreeViewItem item = (TreeViewItem)treeview.SelectedItem; 
     item.IsExpanded = true; 


    } 

其中treeview是你的TreeView的名称,你可以包含一个if来根据它的当前状态关闭/打开。