【发布时间】:2012-04-03 06:00:19
【问题描述】:
我有一个带有许多 DataGrid(来自 Silverlight Toolkit)的 SL 应用程序,每个都有自己的视图。如果打开了多个 DataGrid,则在视图(例如 TabItems)之间进行更改需要很长时间(几秒钟),并且会冻结整个应用程序(UI 线程)。
加载的 DataGrid 越多,更改所需的时间就越长。这些减慢 UI 更改的 DataGrids 可能位于应用程序的其他位置,此时甚至不可见。但是一旦它们被打开(并加载了数据),它们显示其他 DataGrid 的速度就会变慢。 请注意,DataGrid 不会被释放然后重新创建,它们仍然保留在内存中,只是它们的父控件被隐藏并再次可见。
我已对应用程序进行了概要分析。说明agcore.dll的SetValue函数是瓶颈。不幸的是,这个负责绘图的 Silverlight 本机库无法使用调试符号。
问题不在于 DataGrid 控件 - 我尝试将其替换为 XCeed 的网格,但更改视图时的性能更差。
你知道如何解决这个问题吗? 为什么更多打开的控件会减慢其他控件的速度?
我创建了一个显示此问题的示例:VS solution、live demo
更新: 在提供的示例上使用 VS11 探查器表明问题可能在于 MeasureOverride 被多次调用(我猜对于每个 DataGridCell)。但是,为什么在其他地方加载更多控件时速度会变慢?有没有办法提高性能?
更新 2: 我应该提一下,我不在我的特定应用程序中使用 TabControl。我使用 Caliburn.Micro 和 ContentControl 来显示当前活动的 ViewModel。但是 TabControl 也有同样的问题,所以我用它来描述核心问题。
【问题讨论】:
-
查看这里的讨论(关于 TabControl 的部分),它可能会有所帮助:stackoverflow.com/questions/1389769/…
-
实际上,在我的原始应用程序中,我使用 Caliburn.Micro(MVVM 框架),所以我有一个 ContentControl 绑定到当前活动的 ViewModel(以及它的 View),而不是 TabControl。不过,我会检查讨论并让你知道。谢谢!
-
@Phil 建议的解决方案在我的情况下不起作用:-(
-
您是否考虑过将选项卡控件子类化并覆盖 MeasureOverride?span>
-
您将 CM 用于实际应用,但 PerfTest 没有?
标签: performance silverlight datagrid caliburn.micro