Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.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
调整承载数百个类似控件的WPF应用程序性能_Wpf_Winforms_Performance_User Controls - Fatal编程技术网

调整承载数百个类似控件的WPF应用程序性能

调整承载数百个类似控件的WPF应用程序性能,wpf,winforms,performance,user-controls,Wpf,Winforms,Performance,User Controls,我们刚刚将WinForms应用程序移植到WPF。 但是,性能急剧下降 我们有一个由大约200个用户控件组成的用户界面。 每个UserControl由一个DataGrid(=10列和3-15行)以及一个包含大约10个按钮的面板定义 它们都托管在ScrollViewer中 (请不要建议更改UI。我对此没有任何影响。客户希望能够滚动到这些用户控件中的任何一个。) 由于我们将整个应用程序移植到WPF,启动时间增加了100%。使用WinForms,我们的启动时间为15秒,而现在,我们的启动时间为30秒 你

我们刚刚将WinForms应用程序移植到WPF。 但是,性能急剧下降

我们有一个由大约200个用户控件组成的用户界面。 每个UserControl由一个DataGrid(=10列和3-15行)以及一个包含大约10个按钮的面板定义

它们都托管在ScrollViewer中

(请不要建议更改UI。我对此没有任何影响。客户希望能够滚动到这些用户控件中的任何一个。)

由于我们将整个应用程序移植到WPF,启动时间增加了100%。使用WinForms,我们的启动时间为15秒,而现在,我们的启动时间为30秒

你有什么建议或想法来提高UI的加载时间吗?UI由相同的UserControl组成,每个UserControl只绑定到不同的ViewModel?(可能是快速克隆UserControl实例或类似的东西?)

我尽可能使用静态资源。 我尽量避免网格和自动调整大小

希望有人能分享一些想法

谢谢,
TH

仅尝试创建当时可见的控件,使用延迟加载


也许
SnapsToDevicePixels=true
也能帮上一点忙。

首先找出时间的原因

也许是控制,也许不是。通常是数据结构


我使用了。

伙计们,我考虑了以下实现。如果有人有疑问,请告诉我:

我将实现我自己的虚拟化“StackPanel”,它支持平滑滚动

目前,我们假设我的用户控件的高度是固定的。一个页面可能包含5个用户控件

然后,我将继续缓存前面的页面和继续的页面:

在内存中,我将始终保持15个用户控件。 ScrollViewer的内容是画布。 my UserControls的位置通过设置Canvas.Top进行调整。 假设目前的情况如下:

用户已滚动到第2页。 这意味着UserControl 5-9是可见的。现在用户向下滚动。 一旦UserControl 5变为不可见,我将获取顶部的UC(在本例中为UserControl 0),更改其ViewModel并调整其Canvas.top,以便它现在是位于ControlCollection末尾的控件。 如果用户进一步滚动,请更改其ViewModel并调整其Canvas.Top。 等等

此外,我将手动设置Canvas.Height,以便ScrollViewer以正确的方式表示滚动条

我希望我的解释可以理解:)

你觉得怎么样

比尔,
我记得读过一些关于UserControl的每个实例如何加载资源字典的内容。所以,如果你有你所描述的那么多,你可能需要一段时间来加载它们

不幸的是,我找不到我记得的链接,但这里有一个可能会有所帮助:

另一件事是不要使用UserControls,而是使用DataTemplate来构建数据网格和按钮。或者为包含按钮的datagrid创建自定义控件模板。任何一个都可能更快


希望这能有所帮助。

我的最终解决方案是一个支持动态高度项目的自定义虚拟面板

有关如何创建虚拟配线架的信息,请参见

My UserControls支持两种状态: -首字母 -装载

当应用程序处于空闲状态时,虚拟面板要求控件更改为“已加载”状态。这将加载昂贵的用户控件

像这样,所有内容都是延迟加载的,一旦用户停止滚动,可见的项目就会加载

也许这能帮助其他处于同样处境的人。
我很难想象这种GUI看起来有多有趣:)我不相信所有的控件都必须同时始终可见。启动时间只是表单还是整个应用程序?按照codymanix所说的,你能延迟一些控件的填充直到窗口打开(可能是后台异步)吗?这是一个表单的启动时间。一些等待动画已经出现,以解释某些加载过程正在进行。所有用户控件都由ScrollViewer托管。也许我可以显示第一组,显示视图,然后一个接一个地添加缺少的用户控件。。。但是,在添加所有项目之前,ScrollViewer仍然无法真正使用…确保您可以使用ScrollViewer,即使不是所有控件都在其中。您只需将内容面板的大小设置为它将具有的大小,就好像所有控件都已添加一样。滚动事件中的检查是否滚动到控件仍然丢失的位置,然后显示它们。@codymanix:我看到这种方法的唯一问题是,我不想计算整个面板的高度。由于每个UserControl中的每个网格可以有不同数量的行,因此高度是不同的。当然,我可以做一个估计的计算,但对我来说这听起来不太漂亮?我已经分析了应用程序。WPF中的任何地方都会损失40%的时间。你知道有哪种非采样分析器可以告诉我.NET Framework的哪些方法会占用时间吗?@TwinHabity:要做的事情是在调试器下运行它,当它运行缓慢时,点击暂停按钮,然后研究调用堆栈。花点时间去理解它为什么要做它正在做的事情。这样做5-10次。它将告诉您问题出在哪里,您需要知道的是代码中的哪些行大部分时间都在堆栈上,以及为什么。示例:如果是绘制,可能只需要暂停绘制,直到所有控件都启动。如果它正在构建大数据结构并将其全部交叉链接,那将是另一个问题。也许两者都在发生。也许完全是别的我听了你的建议