WPF:是否有内置的TreeGrid/TreeListView?

31

我需要类似于这样的东西:

alt text

(我需要TreeView和ListView两个方面,即层次结构和列)

但是,我需要它在WPF中。这是内置的还是我需要自己构建?

我认为它必须在框架中的某个地方,因为VS2010是在WPF中构建的。

编辑: 我已经使用TreeView和一些网格以及它们的列绑定到父网格的列来获得了一些我想要的功能,但是功能中存在太多怪癖。

编辑2: 我至今仍然没有找到实现此目标的方法。有任何想法吗?

7个回答

12

6

您是否考虑过使用 Xceed.Wpf.DataGrid

您可以在此处查看完整版本的演示:这里

还有一个社区版,作为Extended WPF Toolkit™的一部分 - Ms-PL许可证

完整版功能列表
社区版功能列表
不幸的是,我找不到表格样式的编译。

P.S.

  1. 通过使用 Snoop(WPF Spy实用程序)和Visual Studio 2010(专业版)上的Spy++,我发现您在WatchLocalAutos工具窗口中看到的TreeGrid被称为TREEGRID,它不是Wpf组件。(但我不确定它是什么)。
    有趣的是,我发现断点工具窗口是通过并排使用两个组件 - SysTreeView32SysListView32构建的。

  2. 我与Xceed没有关系:-)

编辑:
看来在两个版本中都可以实现层次结构,但只有在完整版中才存在主细节,而在社区版中只能使用分组来实现。
:-(


在Visual Studio 2017中,大多数_ToolWindow_都是托管在Microsoft.VisualStudio.Platform.WindowManagement.WindowFrame+ContentHostingPanel内的Microsoft.VisualStudio.Platform.WindowManagement.GenericPaneClientHwndHost,但内部控件(Tree+Grid)并不是真正的WPF控件。这些可能是存储在Microsoft.VisualStudio.Platform.WindowManagement.dll附近的一些内部(和本地?)控件。 - itsho

0

你可以尝试在TreeView的模板中使用特别对齐的共享Grid对象来伪造此显示...

然而,我不认为你在Visual Studio中看到的是WPF控件实现,因为它在Visual Studio 2008中也存在,很可能是自定义本地控件或自定义Windows Forms控件。

好消息是:如果你一定要拥有这种体验并且想要尽快实现...虽然这是一个完全的hack,但是:使用Windows Forms与你的WPF应用程序进行交互。

微软员工在'06年博客中发布了一个winforms TreeGridView实现:


我认为那是WinForms。 - John Gietzen
正确。我已经注意到了上面的内容,“这是一种完全的hack,但是请在您的WPF应用程序中使用Windows Forms互操作性。” - Jeff Wilcox
所有链接都已失效。 - Welcor
@Welcor 这是原始博客链接:https://web.archive.org/web/20060113083903/http://blogs.msdn.com/markrideout/archive/2006/01/08/510700.aspx,预编译二进制文件可以在这里找到:https://web.archive.org/web/20080305082707/http://blogs.msdn.com/markrideout/archive/2006/01/18/new-link-for-treegridview.aspx。 - radj307

0

这个对我来说非常好用。 https://www.codeproject.com/Articles/30721/WPF-TreeListView-Control

  • 你需要实现ITreeModel接口,包括GetChildren和HasChildren方法。最好查看注册表示例的示例代码以了解如何完成。由于某种原因,开发人员忘记添加一个简单的示例...
  • 你需要自己添加依赖属性到控件中,才能使其与MVVM一起使用。因此可能需要进行一些调整。将以下内容添加到TreeList.cs中,以便能够绑定TreeModel:

 

public ITreeModel TreeModel
{
    get => (ITreeModel)GetValue(TreeModelProperty);
    set => SetValue(TreeModelProperty, value);
}

public static readonly DependencyProperty TreeModelProperty =
    DependencyProperty.Register(
        "TreeModel",
        typeof(ITreeModel), 
        typeof(TreeList), 
        new PropertyMetadata(null, OnModelChanged));

private static void OnModelChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var treeList = (TreeList) d;
    treeList.Root.Children.Clear();
    treeList.Rows.Clear();
    treeList.CreateChildrenNodes(treeList.Root);
}

-1

7
ObjectListView基于WinForms构建,而不是WPF。 - Pakman
ObjectListView 可以在 WPF 中使用,但是当我尝试使用它时,出现了很多闪烁问题,而在 Winforms 中使用相同的实现时却没有这些问题,因此我不建议使用它。 - Marc.O

-1

您可以通过按照这个教程(滚动到使用ViewModel进行虚拟分组部分)来在DataGrid中获得类似的行为。

教程的解决方案已经足够好了,但是当一些行被折叠时,滚动可能会变得很卡顿,并且其行为也不可预测。

更新:我改变了子项的隐藏方式。现在,我从绑定的ObservableCollection中删除了项目,而不是折叠行。现在滚动效果非常完美!


-2

您正在寻找 TreeViewhttp://msdn.microsoft.com/zh-cn/library/system.web.ui.webcontrols.treeview.aspx

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:sys="clr-namespace:System;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
    <Page.Resources>
        <XmlDataProvider x:Key="StaticXml" XPath="root/foo">
            <x:XData>
                <root xmlns="">
                    <foo a="_File">
                        <foo a="New">
                            <foo a="_Project..." />
                            <foo a="_Web Site..."/>
                        </foo>
                        <foo a="C_lose"/>
                        <foo a="E_xit"/>
                    </foo>
                    <foo a="_Edit">
                        <foo a="Cu_t"/>
                        <foo a="_Copy"/>
                        <foo a="_Paste"/>
                    </foo>
                </root>
            </x:XData>
        </XmlDataProvider>
        <HierarchicalDataTemplate x:Key="MenuTemplate" ItemsSource="{Binding XPath=foo}">
            <AccessText Text="{Binding XPath=@a}"/>
        </HierarchicalDataTemplate>
    </Page.Resources>
    <StackPanel>
        <TreeView
                ItemsSource="{Binding Source={StaticResource StaticXml}}"
              ItemTemplate="{StaticResource MenuTemplate}"/>
    </StackPanel>
</Page>

1
我需要多列。我已经尝试了大约4个小时来从TreeView中提取多列,但结果不太令人满意。 - John Gietzen

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