ItemsControl / TextBox的性能降低

时间:2019-04-05 18:12:40

标签: c# wpf performance

我的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个状态。另外,我在屏幕上看到了两个半舞台,所以尽管看不见,但最后一个舞台的一半渲染应该不是问题。

感谢任何帮助

1 个答案:

答案 0 :(得分:0)

我将使用可编辑的DataGrid。这可能绑定到您可观察的集合。好处是仅在编辑时才创建文本框,否则将使用文本块。您可以设置网格样式以使其看起来像您的图片。您还可以在鼠标按下时将单元格设置为编辑模式,因此只需单击一次即可输入文本框(单元格)。

这里是一个例子。您可以通过隐藏标题并添加一些单元格填充来获得所需的外观。

enter image description here

相关问题