C# WPF“;“全部展开”;控制加载时间
我已经在我的工具中集成了一个特性,它允许我递归地扩展所有的功能。我意识到这通常是一个缓慢的过程,但目前为止。我可能有100个嵌套控件,它们都是一次展开的,所以调用Expand all意味着每个控件/数据模板等都是一次处理的 这会导致工具在响应前锁定10秒钟。当然,一旦构建了视图层次结构,它的速度就会很快(从那时起,我可以立即折叠和展开)。但似乎有点奇怪,没有一种更快的方式来生成大的表单,我不认为100-500控制非常多。 我已经研究过虚拟化,但在这种情况下,它似乎对我没有什么用处,因为所有的控件都是一次扩展的。如果我在单数的基础上展开它们就可以了 编辑: 更新我们需要回答的问题,以描述我的窗口的布局: 我有许多文本框、组合框、滑块,它们都嵌套在许多扩展器中。每个扩展器可以包含N个扩展器,这在某种程度上是递归的。取决于数据的布局方式。其中一些数据类型(由datatemplates表示)可能包含StackPanel(如果需要)和许多布局网格 要扩展所有内容,只需迭代每个扩展程序(IsExpanded绑定到IsExpanded属性)。我将每个数据类型(及其子类型)的此属性设置为true。让绑定完成扩展一切的工作。这会导致一次添加每个控件C# WPF“;“全部展开”;控制加载时间,c#,wpf,performance,C#,Wpf,Performance,我已经在我的工具中集成了一个特性,它允许我递归地扩展所有的功能。我意识到这通常是一个缓慢的过程,但目前为止。我可能有100个嵌套控件,它们都是一次展开的,所以调用Expand all意味着每个控件/数据模板等都是一次处理的 这会导致工具在响应前锁定10秒钟。当然,一旦构建了视图层次结构,它的速度就会很快(从那时起,我可以立即折叠和展开)。但似乎有点奇怪,没有一种更快的方式来生成大的表单,我不认为100-500控制非常多。 我已经研究过虚拟化,但在这种情况下,它似乎对我没有什么用处,因为所有的控件
谢谢所以在阅读了编辑后的问题后,我猜发生了什么: UI忙于呈现控件。我假设viewmodels绑定中没有太多的数据,所以数据不是问题的重点 当Expander控件第一次获得
IsExpanded=true
时,将解析Xaml(对象/资源解析,而不是编译),并创建可视化树子级。
100-500个可视化树元素对于渲染来说是一个很高的数字,因为每个元素(如果它属于System.Windows.Controls
命名空间)都包含许多子控件(边框
,网格
,文本框
,…)
您可以实现的不是缩短扩展时间,而是解锁UI:
建议调度程序异步处理IsExpanded
,并查看其行为。这要求您不使用expanders默认操作:
在箭头按钮中单击处理程序,跳过默认处理并插入此(IsExpanded
是您的绑定viewmodel属性):
虚拟化在您的情况下是有意义的。您的状态已扩展,但不会降低性能成本,因为模板将在进入视图时加载。通常,视图中有30-50个项目,而不是500个。这是加载时间——我担心的不是渲染成本。完全虚拟化后,视图外的对象不存在。为什么不将加载耦合到视图中创建的对象上呢?渲染和加载将齐头并进!您所说的“将加载耦合到视图中创建的对象上”是什么意思。别忘了按“展开”键,似乎每个对象都会同时加载。
Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
() => { this.IsExpanded = true; } ));