Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF“;“全部展开”;控制加载时间_C#_Wpf_Performance - Fatal编程技术网

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

C# WPF“;“全部展开”;控制加载时间,c#,wpf,performance,C#,Wpf,Performance,我已经在我的工具中集成了一个特性,它允许我递归地扩展所有的功能。我意识到这通常是一个缓慢的过程,但目前为止。我可能有100个嵌套控件,它们都是一次展开的,所以调用Expand all意味着每个控件/数据模板等都是一次处理的 这会导致工具在响应前锁定10秒钟。当然,一旦构建了视图层次结构,它的速度就会很快(从那时起,我可以立即折叠和展开)。但似乎有点奇怪,没有一种更快的方式来生成大的表单,我不认为100-500控制非常多。 我已经研究过虚拟化,但在这种情况下,它似乎对我没有什么用处,因为所有的控件

我已经在我的工具中集成了一个特性,它允许我递归地扩展所有的功能。我意识到这通常是一个缓慢的过程,但目前为止。我可能有100个嵌套控件,它们都是一次展开的,所以调用Expand all意味着每个控件/数据模板等都是一次处理的

这会导致工具在响应前锁定10秒钟。当然,一旦构建了视图层次结构,它的速度就会很快(从那时起,我可以立即折叠和展开)。但似乎有点奇怪,没有一种更快的方式来生成大的表单,我不认为100-500控制非常多。 我已经研究过虚拟化,但在这种情况下,它似乎对我没有什么用处,因为所有的控件都是一次扩展的。如果我在单数的基础上展开它们就可以了

编辑:

更新我们需要回答的问题,以描述我的窗口的布局:

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

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


谢谢

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

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; } ));