我有一个带有HierarchicalDataTemplate的WPF TreeView。
目前,我必须双击某个项目才能展开/折叠它。
我想将此行为更改为单击,而不会丢失其他功能。所以它应该在点击时展开和折叠。
建议的方法是什么?
谢谢!
答案 0 :(得分:4)
您可以使用重新模板化的复选框作为您的节点(包含您当前使用的任何模板),并将其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>
只需将ControlTemplate内容替换为您需要的任何内容。
答案 1 :(得分:4)
如果您使用标准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;
}
在您的情况下,您最需要对绑定和ViewModel执行某些操作。以下是CodePlex的一篇好文章:Simplifying the WPF TreeView by Using the ViewModel Pattern。
答案 2 :(得分:1)
只需使用所选项目更改事件并使用以下内容
private void treeview_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
TreeViewItem item = (TreeViewItem)treeview.SelectedItem;
item.IsExpanded = true;
}
其中treeview是TreeView的名称,您可以根据其当前状态包含if关闭/打开。
答案 3 :(得分:0)
到目前为止,我对使用WPF的经验很少,所以我不是100%肯定的。但是,您可以查看Treeview和TreeView项的.HitTest方法(WPF Treeview本质上是Windows.Controls.Treeview,是吗?或者是它的推导?)。
在您键入大部分方法名称之前,测试方法并不总是自动出现在标准Windows.Forms.Treeview(我正在使用VS 2008)的Intellisense菜单中。但它应该在那里。你可能需要经历。
您可以使用.HitTest方法处理MouseDown事件并返回对所选树视图项的引用。但是,如果用户单击控件中不包含Tree Items的区域,则必须测试null返回。一旦你有一个特定项目的引用,你应该能够将其.expanded属性设置为当前任何项目的反转。再次,这里可能需要一些实验。
正如我所说,我还没有真正使用过WPF,所以我可能会遇到这个错误。 。
答案 4 :(得分:0)
Metro Smurf的答案(感谢我得到了我想去的地方)提出了正确的方法。您可以简单地连接到Treeview的SelectedItemChanged事件。然后将在事件处理程序中传递的e.NewValue转换为TreeViewItem,并访问其IsExpanded属性以将其设置为true。
void MyFavoritesTreeView_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
((TreeViewItem)e.NewValue).IsExpanded = true;
}
然后,对于最后的触摸,您还可以通过按照建议将它们作为TreeViewItem连接来连接Treeview中的项目,然后您可以连接到各种操作事件,例如:
var item = tv.SelectedItem as TreeViewItem;
item.Expanded += item_Expanded;
然后在eventhandler中做任何你需要做的事情
void item_Expanded(object sender, RoutedEventArgs e)
{
// handle your stuff
}