WPF“全部展开”控制加载时间

时间:2014-12-02 08:42:28

标签: c# wpf performance

我在我的工具中集成了一个功能,允许我以递归方式展开所有功能。我意识到这通常是一个缓慢的过程,但目前。我可能有100个嵌套控件,这些控件都是一次扩展的,因此调用Expand All意味着每次都会处理每个控件/数据模板等。

这会导致工具在响应前锁定10秒钟。当然,一旦构建了视图层次结构,它就会很快(我可以从那时起立即崩溃和扩展)。但似乎有点奇怪的是,没有更快的方法来生成大型表单,我不会考虑100-500~控件很多。

我已经研究过虚拟化,但在这种情况下它似乎对我没用,因为所有控件都会立即扩展。如果我在单一的基础上扩展它们就好了。

编辑:

我们需要更新问题来描述窗口的布局:

我有许多TextBoxes,ComboBoxes,Sliders,它们都嵌套在许多Expanders中。每个扩展器可以包含N个扩展器,这在一定程度上是递归的。取决于数据的布局方式。其中一些数据类型(由datatemplates表示)可能包含StackPanels(如果需要)和许多布局网格。

扩展它只是意味着迭代每个扩展器(IsExpanded绑定到IsExpanded属性)。我将每个数据类型(及其子项)的此属性设置为true。让绑定做扩展一切的工作。这会导致一次添加每个控件。

由于

1 个答案:

答案 0 :(得分:0)

因此,在阅读编辑过的问题之后,我猜到了发生了什么:

UI忙于渲染控件。并且我假设视图模型中绑定的数据不多,因此数据不是您问题中的重点。

当Expander控件第一次获得IsExpanded = true时,解析Xaml(对象/资源解析,而不是编译),并创建可视树子节点。 100-500个可视化树元素是一个用于渲染的高数字,因为它们中的每一个(如果它属于System.Windows.Controls命名空间)由许多子控件组成(BorderGrids,{ {1}},...)。

您可以实现的不是缩短扩展时间,而是取消阻止UI: 建议调度员异步处理TextBox并查看其行为。这要求您不要使用扩展器默认操作: 在箭头按钮单击处理程序中,跳过默认处理并插入此(此处IsExpanded是您的绑定viewmodel属性):

IsExpanded