【问题标题】:How to correctly implement VirtualizingWrapPanel in WPF如何在 WPF 中正确实现 VirtualizingWrapPanel
【发布时间】:2021-08-12 06:02:05
【问题描述】:

我是 WPF 的新手,我的应用程序的性能存在一些问题。解决方案应该是 VirtualizingWrapPanel。我做了一些研究,没有多少教程或文档可以解释如何正确使用它。我下载了一个示例项目并构建了一个 DLL (https://github.com/sbaeumlisberger/VirtualizingWrapPanel)。然后我在我的程序中引用了这个并尝试了这个代码:

<vwp:VirtualizingItemsControl VirtualizingPanel.CacheLengthUnit="Item" VirtualizingPanel.ScrollUnit="Pixel" VirtualizingPanel.VirtualizationMode="Recycling">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <vwp:VirtualizingWrapPanel Orientation="Vertical" SpacingMode="None" StretchItems="False"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
            
    <local:my_custom_control/>
    <local:my_custom_control/>
    <local:my_custom_control/>
    <local:my_custom_control/>
    <local:my_custom_control/>
    <local:my_custom_control/>
    ...

</vwp:VirtualizingItemsControl>

但是,此代码不起作用,并且具有与普通环绕面板完全相同的性能。有谁知道问题是什么?如果这听起来很愚蠢或类似的东西,我很抱歉,我对这些东西有点陌生。

【问题讨论】:

  • 虚拟化面板的目的是避免“显示”未在可见区域中绘制的元素,之后......有一点边缘可以平滑它......当你向下滚动元素时被画了(我希望不要用preterit犯错误)。也许您应该从嵌入式 virtualizin(stack) 面板开始(如果我没记错的话)来确定对您的应用程序的影响。之后你可以更容易地知道这是一个 ui 问题,一个代码问题,或者问题是否来自控件(配置)
  • 这是我的带有普通 WrapPanel 的程序:youtu.be/v5D2diycLnM。如您所见,性能非常好,据我所知,虚拟化应该有很大帮助。所以我的问题是如何正确使用 VirtualizationWrapPanel?我尝试了上面的代码,但这是不正确的。

标签: c# wpf virtualization wrappanel


【解决方案1】:

经过多次尝试,我得到了它。这是我的代码:

Xaml:

<vwp:VirtualizingItemsControl Name="vic" 
                               VirtualizingPanel.CacheLengthUnit="Item" 
                               VirtualizingPanel.ScrollUnit="Pixel" 
                               VirtualizingPanel.VirtualizationMode="Recycling"
                               VirtualizingPanel.IsVirtualizingWhenGrouping="True"
                               >
     <ItemsControl.ItemsPanel>
         <ItemsPanelTemplate>
             <vwp:VirtualizingWrapPanel Orientation="Vertical" SpacingMode="None" StretchItems="False" />
         </ItemsPanelTemplate>
     </ItemsControl.ItemsPanel>
 </vwp:VirtualizingItemsControl>

C#:

List<Button> buttons = new List<Button>();

list.add(new Button() { Content = "Name", Width = 90, Height = 40 });

vic.ItemsSource = buttons;
ICollectionView cv = CollectionViewSource.GetDefaultView(vic.ItemsSource);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-11
    • 2020-08-07
    • 2020-10-11
    • 2021-11-03
    • 2021-12-13
    • 2013-10-03
    • 2019-11-23
    相关资源
    最近更新 更多