虚拟化嵌套容器(virtualizingstackpanel)在WPF单亲滚动条(virtualiz

2019-09-21 11:25发布

我有种编码到自己在这一个咸菜。 我正在写一个自定义的WPF控件是类似于TreeListView描述这MSDN文章 ,以及在网络上其他许多地方。 这个东西一个相当大的堆在这一点上的定制,它的满足我的目标还算不错,除了在虚拟化领域。 我重写TreeViewTreeViewItem模板都使用VirtualizingStackPanel s到展示他们的项目,我已经证明了随着预期这一切是越来越创建。 虚拟化可以正常工作的根目录下的项目(仅适用于那些当前可见的UI元素ScrollViewer都熟了起来),和TreeView东西需要不生成崩溃节点元素的照顾。 扩展一个节点时,问题就来了 - 所有元素都被炮制为节点中的每一个孩子,甚至是屏幕外的数千人。

在我看来,像所有我需要做的是某种程度上的内部嵌套的scrollowner属性设置VirtualizingStackPanel s到同一主滚动视图根级VSP被默认迷上了,但我读了MSFT海报在这里说,这将不行。

不幸的是这个东西是缓慢,因为没有出现虚拟化泥,所以我需要拿出某种形式的解决方案。 任何建议将不胜感激。

Answer 1:

我知道这是一个老问题,但仍然是相关的我。

在我来说,我想到了一个TreeView不会削减,因为我到底需要两层,类型显示项目是在两层之间的不同。 另外,我重构列表Expander太我想更多的一维。

但后来我意识到,你可以自定义ItemTemplate中的TreeView ,包括你自己的HierarchicalDataTemplate ,并且您可以自定义ItemTemplate是的HierarchicalDataTemplate用自己定制DataTemplate ...普雷斯托! 整整两层,在每个不同的东西!

所以我的观点是, TreeView是足够灵活,你应该尽量不要创建自己的自定义控制。

这是我做的:

XAML:

<Page x:Class="Foo.Views.TreePage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      xmlns:local="clr-namespace:Foo.Views"
      xmlns:viewModel="clr-namespace:Foo.ViewModels"
      mc:Ignorable="d" 
      d:DesignHeight="300" d:DesignWidth="300"
      Title="Tree page"
      d:DataContext="{d:DesignInstance Type=viewModel:TreeModel}">
    <TreeView
        VirtualizingPanel.IsVirtualizing="True"
        VirtualizingPanel.VirtualizationMode="Recycling"
        ScrollViewer.CanContentScroll="True"
        VirtualizingPanel.ScrollUnit="Pixel"
        ItemsSource="{Binding Values}"><!-- IList<Person> -->
        <TreeView.ItemTemplate><!-- Template for first layer, which has a HierarchicalDataTemplate so that this layer will expand -->
            <HierarchicalDataTemplate
                ItemsSource="{Binding Expenses}"><!-- IList<Expense> -->
                <HierarchicalDataTemplate.ItemTemplate><!-- Template for the second layer, which has a DataTemplate instead of HierarchicalDataTemplate so that this layer won't expand -->
                    <DataTemplate>
                        <TextBlock Text="{Binding Amount}"/><!-- Expense amount in dollars -->
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>

                <TextBlock Text="{Binding Name}"/><!-- Person name -->
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>
</Page>

Person等级:

public class Person
{
    public string Name { get; set; }
    public List<Expense> Expenses { get; set; }
}

Expense类:

public class Expense
{
    public double Amount { get; set; }
}

下面是它的外观:

我检查它探听证明它是UI虚拟化。 下面是装数量TreeViewItem ■当应用程序是小:

...这是加载的数量TreeViewItem ■当应用程序被全屏(它不断超越这个片段中,但你的想法):

现在,这只是事情的造型简单的事情,使嵌套层看怎么想!

编辑:我只是验证了TreeView虚拟化的所有层,不只是第一层。



Answer 2:

我有一个链接,什么不该用虚拟化的StackPanel做一个名单,但由于某些原因该页面出现空白。 这里是一个谈了一点另一页:

http://www.designerwpf.com/2008/02/12/listview-and-listbox-performance-issues/

甚至链接到一个IM议论纷纷,但其始终空白。 如果您在网页上看看它的链接马克Shurmer的博客。 下面是如果你想尝试一下链接:

http://itknowledgeexchange.techtarget.com/wpf/listview-is-it-really-too-slow/

BEA Stollnitz也有一些关于它的文章,可能会有所帮助:

第1部分 第2部分 第3部分

如果您发布一些代码的,有人也许能解开这个意大利面条有点帮助你得到一个更好的实现。

编辑:发现可能工作的链接(谢谢archive.org !!!): http://web.archive.org/web/20080104163725/http://itknowledgeexchange.techtarget.com/wpf/listview-is-it -really太缓/



文章来源: virtualizing nested containers (virtualizingstackpanel) to a single parent scrollbar in WPF