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来根据它的当前状态关闭/打开。