WinRT中UserControl的IsLoaded属性

时间:2013-04-01 02:45:13

标签: xaml windows-8 winrt-xaml

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

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

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

所以,问题: 如何在WinRT中访问IsLoaded的{​​{1}}布尔值?

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

3 个答案:

答案 0 :(得分:3)

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

至于它被移除的原因,我可以根据WPF属性的documentation进行有根据的猜测:

  

从新构造的FrameworkElement开始,此属性启动   false,并且在设置为true后仍然为true,即使元素也是如此   随后通过代码从连接的逻辑树中删除。真正   当元素为时,state由一般表示逻辑设置   加载到演示引擎中。

基本上,WPF中的属性有时错误。控件可以多次加载(并触发其Loaded事件),并在此期间卸载。 WPF IsLoaded属性可以表示控件已加载,即使它不是真的。那......非常糟糕。

他们可能会删除它而不是修复它,原因至少有以下一个原因:

  • 他们不想破坏WPF中与旧版本的兼容性,或者在WPF与SL / WinRT中具有不同行为的属性
  • 跟踪是否有东西被加载是困难的,容易出错,因此本质上是危险的
  • 无论如何,查询控件的加载状态可能是不好的做法/坏主意

如果你真的想自己实现它,那么至少要听Unloaded以及Loaded。但我认为,根据您的目标,可能会有更好的解决方案。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

Loaded事件似乎是你要求的唯一方法。