WPF在单击鼠标时展开TreeView

时间:2011-03-04 14:38:02

标签: wpf treeview double-click

我有一个带有HierarchicalDataTemplate的WPF TreeView。

目前,我必须双击某个项目才能展开/折叠它。

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

建议的方法是什么?

谢谢!

5 个答案:

答案 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
}