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

本文关键字:控制 加载 时间 全部展开 全部 WPF | 更新日期: 2023-09-27 18:32:41

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

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

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

编辑:

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

我有许多文本框,组合框,滑块,它们都嵌套在许多扩展器中。每个扩展器可以包含 N 个扩展器,这在一定程度上是递归的。取决于数据的布局方式。其中一些数据类型(由数据模板表示(可能包含 StackPanel(如果需要(和大量用于布局的网格。

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

谢谢

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

所以在阅读了编辑后的问题,我猜到了发生了什么:

UI 正忙于呈现控件。而且我假设在绑定的视图模型中没有保留太多数据,因此数据不是您问题的重点。

当 Expander 控件首次IsExpanded = true时,将分析 Xaml(对象/资源分析,而不是编译(并创建可视化树子项。100-500 个可视化树元素对于呈现来说是一个很大的数字,因为它们中的每一个(如果它属于 System.Windows.Controls 命名空间(都由许多子控件(BorderGridsTextBox ,..(组成。

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

Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
                () => { this.IsExpanded = true; } ));