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