我的wpf应用程序存在性能问题。我正在显示带有许多文本框的表单(例如130左右)。它是一种软件,用户可以在蒸馏机的三个阶段中配置许多状态。该表单包括三个部分(阶段),每个部分可以具有不同数量的状态和一些固定数量的属性来设置。每个状态都提供用户选项以设置6个值(通过文本框)。
因此,如果一个阶段包含7个状态,则它具有7x6 + 5(固定数量)= 47个文本框。因此,这三个阶段可以显示141个文本框(该数目会减少,因为只有两个阶段可见,其余部分可以向下滚动)。
https://pasteboard.co/I8LiVxG.png
要显示每个阶段的状态,我正在使用带ObservableCollection绑定的ItemsControl。这是VS性能分析器的瓶颈,因为应用程序在布局(橙色)上花费了太多时间。 当我用StackPanel和固定数量的状态交换ItemsControl时,问题就消失了。
https://pasteboard.co/I8Lhu37.png
当然,UI有点复杂,有一个带有蒸馏器进程的列表框,每个进程都以阶段和状态详细显示。我也有viewmodels和bindings,状态计数可以在运行时更改,因此有ObservableCollection绑定到ItemsControl。这些都不是导致问题的原因,我试图关闭大多数重置值或重新创建状态集合的mvvm代码。
<ItemsControl Grid.Row="2" ItemsSource="{Binding Cuts}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<local:RunConfigControl DataContext="{Binding}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
在上面的代码中,RunConfigControl只是一个具有6个文本框和标签的网格。 Cuts是ObservableCollection的名称。
当我在StackPanel中仅使用固定数量的控件以及将ItemsControl与集合一起使用时,有什么区别?当我看视觉树时,还有StackPanel。
我也知道控件在不可见时呈现(我不使用虚拟化),但是状态不多(在2-10之间),阶段数始终为3。同样,所有状态都必须可见我不需要显示3个状态并滚动其他7个状态。另外,我在屏幕上看到了两个半舞台,所以尽管看不见,但最后一个舞台的一半渲染应该不是问题。
感谢任何帮助