【问题标题】:InitializeComponent / ShowDialog and databindingInitializeComponent / ShowDialog 和数据绑定
【发布时间】:2014-03-19 09:02:30
【问题描述】:

我正在使用非常复杂的 WPF 窗口,其中包含很多控件。 在我的上下文中,我们选择的用户体验是首先显示窗口,然后加载数据和数据绑定(同时显示进度条)。

借助 Visual Studio 中的 WPF 跟踪,我注意到在显示窗口之前调用了两次数据绑定:

  1. 当我们调用解析 XAML 的 InitializeComponent() 时。
  2. 当我们调用 ShowDialog() 时。

由于还没有数据,数据绑定机制需要相当长的时间来尝试回退和默认值。

为了加快向用户显示窗口的速度,有没有办法在显示窗口之前禁用 WPF 数据绑定?

提前致谢。

编辑 1 : 我在表单上有超过 400 个控件。对 InitializeComponent() 的调用需要 700 毫秒才能完成。我不知道其中有多少与数据绑定有关,可能是我弄错了。

编辑 2 : 根据 dotTrace 分析器,InitilizeComponent() WPF 成本为 65.43%,分为:

  • 34.25% 系统.Windows
  • 22.57% System.Windows.Markup
  • 8.29% 其他

编辑 3 : InitializeComponent() 的时间缩短到 272 毫秒。 我们有很多转换器,singletons 现在用于所有转换器。

【问题讨论】:

  • 能否提供每个阶段的毫秒数?
  • 参见 EDIT 1 了解 InitializeComponent。 ShowDialog 在表单关闭之前不会返回,这可能有点难以衡量。

标签: c# wpf .net-3.5


【解决方案1】:

肯定的。

一个直接的选择是删除与数据绑定相关的 XAML 标记并从代码隐藏中执行相同的操作,但仅在显示窗口之后(或在您认为合适的任何其他条件下)。请参阅此MSDN example,了解如何在代码中进行数据绑定。

另一种选择是不直接绑定到您的“真实”数据源(尚不清楚为什么会导致速度变慢,但我相信你的话)而是代理具有开/关开关的对象: 从关闭开关开始,让代理返回空数据集,待窗口显示后开启。

【讨论】:

  • 我在表单上有超过 400 个控件。对 InitializeComponent() 的调用需要 700 毫秒才能完成。我不知道其中有多少与数据绑定有关,可能是我弄错了。
  • @omatrot:找到一个简单的方法是删除所有绑定。在任何情况下,InitializeComponent 负责为您的页面解析 BAML(“已编译的 XAML”),实例化所有控件并将所有内容连接起来 - 基本上是您通常需要从代码中执行的所有操作,以及您在 Windows 中看到的内容形成 .designer.cs 文件。 700 毫秒听起来确实很多,但不可能盲目猜测为什么会发生这种情况。
【解决方案2】:

有趣的点。绑定时间这么长?

InitializeComponent() DataContext 通常为空,需要几毫秒才能解决绑定问题。问题可能出在其他地方。

在DataBinding机制中使用默认值清晰、快速、简单。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-19
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 2012-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多