WPF:单击鼠标展开TreeView

7

我有一个带有层次数据模板的WPF TreeView。

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

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

有什么推荐的方法吗?

谢谢!

5个回答

5

您可以使用重新模板化的复选框作为节点(包含您当前使用的任何模板),并将其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的内容即可。


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的好文章:通过使用ViewModel模式简化WPF TreeView


1

只需使用所选项目更改事件并使用以下内容:

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


    }

如果treeview是您的TreeView的名称,您可以根据其当前状态包含if语句以关闭/打开。


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;

然后在事件处理程序中执行您需要执行的任何操作

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

0

到目前为止,我在使用WPF方面的经验非常少,因此我不确定这里是否有100%的正确性。但是,您可以查看TreeView和TreeViewItem的.HitTest方法(WPF Treeview基本上是Windows.Controls.Treeview,对吧?或者是一个衍生类?)。

.HitTest方法在标准的Windows.Forms.Treeview(我正在使用VS 2008)中并不总是自动出现在Intellisense菜单中,直到您输入大部分方法名称。但是它应该在那里。您可能需要进行实验。

您可以使用.HitTest方法来处理MouseDown事件并返回对所选treeview项的引用。但是,您必须测试返回值是否为空,以防用户单击包含无树项的控件区域。一旦您拥有对特定项的引用,就应该能够将其.expanded属性设置为当前相反的值。在这里可能需要进行一些实验。

正如我所说,我实际上还没有使用过WPF,因此我可能错了......


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接