【问题标题】:IsLoaded property for a UserControl in WinRTWinRT 中 UserControl 的 IsLoaded 属性
【发布时间】:2013-04-01 02:45:12
【问题描述】:

看起来好像 XAML 中的 UserControl 对象中没有 IsLoaded 属性,即使存在 Loaded 事件。

但是MSDN page on IsLoaded 告诉它应该在那里,因为UserControl 派生自FrameworkElement

所以我猜它已在 XAML 中删除(该文档用于 WPF)。但我不敢相信他们只是在 WinRT 中删除了它,他们一定是用其他东西替换了它?

那么,问题: 如何在 WinRT 中访问 UserControlIsLoaded 布尔值?

当然,通过在Loaded 事件上注册回调,总是可以在每个用户控件上手动完成,但对于这么简单的事情来说,这很痛苦。

【问题讨论】:

    标签: xaml windows-8 winrt-xaml


    【解决方案1】:

    Silverlight 中也没有FrameworkElement.IsLoaded,WinRT 更接近 Silverlight,而不是 WPF。

    至于为什么被删除,我可以根据 WPF 属性的documentation 做出有根据的猜测:

    从一个新构建的 FrameworkElement 开始,这个属性开始了 false,并在设置为 true 后保持为 true,即使元素 随后通过代码从连接的逻辑树中删除。真的 状态由一般表示逻辑在元素被设置时设置 加载到演示引擎中。

    基本上,WPF 中的属性有时错误。一个控件可以多次加载(并触发其Loaded 事件),同时被卸载。 WPF IsLoaded 属性可以说即使不是真的加载了控件。那……很糟糕。

    他们可能出于以下原因之一将其移除而不是修复它:

    • 他们不想破坏 WPF 与旧版本的兼容性,或者在 WPF 与 SL/WinRT 中具有不同作用的属性
    • 跟踪某件物品是否已加载既困难又容易出错,因此本身就很危险
    • 查询控件的加载状态可能是不好的做法/无论如何都是个坏主意

    如果你真的想自己实现它,那么至少听听UnloadedLoaded。但我认为根据您的尝试,可能会有更好的解决方案。

    【讨论】:

      【解决方案2】:

      “加载”控件只是可视化树中的一个,因此您可以使用 VisualTreeHelper 检查您的控件和应用程序的 RootVisual 之间是否存在路径,但它可能效率不高,我仍然会建议处理事件。如果你真的经常需要它,你可以实现一个附加的属性/行为,它会给你一个可绑定的 IsLoaded 属性。

      【讨论】:

      • 好吧,看来我会坚持自己设置IsLoaded,但这很痛苦,而且对我来说没有意义。无论如何,不​​要太严重:)顺便说一句,它也保证它的所有孩子也在视觉树中,对吧?
      • 一旦加载的事件被触发,假设可视化树已经被解析和加载是正确的。
      【解决方案3】:

      Windows 运行时版本的框架中没有 IsLoaded 属性。正如您所指出的,您提供的链接不适用于 Windows 运行时。为此,请参阅此 MSDN 链接:FrameworkElement

      Loaded 事件似乎是满足您要求的唯一方法。

      【讨论】:

      • 你知道这背后的原因吗?我找不到删除此属性的充分理由。
      • @Mic - 不,抱歉,我不知道为什么。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多