我在Silverlight.net上发布了这个帖子(here)。我猜他们对于负载如何与其他人一样难以理解,因为我没有得到回复。
发现的MSDN文档说:
您可以处理LayoutUpdated而不是Loaded。 LayoutUpdated是在Silverlight UI中启用控件的序列中的最后一个“对象生命周期”事件。 LayoutUpdated的主要限制是初始化可能不是引发LayoutUpdated的唯一时间。
(问题1)上述语句的反转意味着可以依赖Loaded事件仅引发一次。这是正确的吗?
上面引用的MSDN文档也说(关于加载事件):
当FrameworkElement有已构造并添加到对象树中。 (继承自FrameworkElement。)
上述陈述在此处引用的文档中重复并强化,似乎试图协调该问题。
但是Loaded Event的详细文档说明:
在Silverlight中,在应用模板后不保证会发生Loaded事件。如果您使用Loaded事件进行相对常见的控制方案,这可能是一个问题:您想要检查可视化树...
(问题2)这非常令人困惑。 (以上两个语句是矛盾的)或者(可以构造FrameworkElement并将其添加到对象树中,并且未应用temlate)。后者似乎不太可能,因为第二个msdn语句引用了可视树。请澄清哪些陈述是正确的。 (问题3)此外,“不保证发生之后”意味着它可能发生在之前,还是根本不会发生?
答案 0 :(得分:3)
Loaded事件只会被引发一次,除非你从对象树中删除对象并在以后重新添加它,此时一切都将重复发生。
我可以确认在应用模板之前可以发生Loaded事件。出于这个原因,我在OnApplyTemplate()中执行所有模板和可视化树检查操作,包括任何最后一分钟的初始化。
“不保证在”之后发生“是指操作的顺序,是的。将对象添加到对象树后,将始终发生加载。