XAML WPF StackPanel性能[已关闭]

vptzau2j  于 2022-12-07  发布在  其他
关注(0)|答案(1)|浏览(156)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新问题,以便editing this post可以使用事实与引用来回答.

去年关闭了。
Improve this question
我们使用WPF编写了一个新项目,但在最初的几次测试之后,我注意到当ComboBox元素的数据源中有数千个对象时,它们的性能很差。

<ComboBox.ItemsPanel>   
    <ItemsPanelTemplate>
        <VirtualizingStackPanel />  
    </ItemsPanelTemplate>
</ComboBox.ItemsPanel>

我想知道如果StackPanel控件有几百个自定义元素(UserControl只有一个标签和两个按钮),是否会容易出现这种问题。UserControl(s)是以这种方式在代码中添加到应用程序中的两个/树位置的:

foreach (var obj in myList)
{
    MyUserControl muc = new MyUserControl(obj);
    myStackPanel.Add(muc);
}

有人能告诉我我们是否会遇到问题和/或是否有方法告诉StackPanel重用缓存的对象吗?

iyfamqjs

iyfamqjs1#

我假设当你谈论在StackPanel中显示 “几百个自定义元素” 时,你想添加滚动条,以便使所有元素适合屏幕。
常见的问题是,一次渲染多个项目(或其容器)会影响渲染性能。您在使用ComboBox时已经遇到过这个问题。
你想要的是只为可见的项目创建容器,而不是为所有成百上千的项目创建容器。这被称为UI虚拟化。UI虚拟化的核心是ScrollViewerVirtualizingStackPanel(或VirtualizingPanel),其中ScrollViewer定义可见区域,VirtualizingPanel根据滚动输入控制容器的生成/回收。
您很可能希望将StackPanel替换为ListBox
ListBox垂直堆叠项目,默认情况下具有ScrollViewer由于ListBox的默认PanelVirtualizingStackPanel,它支持UI虚拟化(默认情况下已启用),因此您可以显示“无限”项目,而不会影响渲染性能(只要这些项目容器的视觉化树形结构不是太复杂)。此外,请尝试不要一个接一个地加入项目。这会触发完整的呈现阶段,特别是对于不支援UI虚拟化的控件(例如StackPanel)。请尝试一次或至少批次加入所有项目,这在StackPanel上是不可能的。这是它是错误主机的另一个原因。优化性能:对照品

相关问题