【问题标题】:How does Silverlight Loaded event work?Silverlight Loaded 事件如何工作?
【发布时间】:2011-01-18 02:57:08
【问题描述】:

我在 Silverlight.net (here) 上发布了这个。我猜他们和其他人一样对负载的工作原理感到困惑,因为我没有得到回应。

找到的 MSDN 文档说:

您可以处理 LayoutUpdated 而不是 Loaded。 LayoutUpdated 是在 Silverlight UI 中启用控件序列中的最后一个“对象生存期”事件。 LayoutUpdated 的主要限制是初始化可能不是唯一一次引发 LayoutUpdated。

(问题 1) 与上述语句相反,意味着 Loaded 事件只能被引发一次。对吗??

上面引用的 MSDN 文档也说(关于 Loaded 事件):

在构建 FrameworkElement 并将其添加到对象树时发生。 (继承自 FrameworkElement。)

上述声明在此处引用的文档中重复和强调,似乎试图调和问题。

但是加载事件的详细文档说:

在 Silverlight 中,不能保证在应用模板后发生 Loaded 事件。如果您将 Loaded 事件用于相对常见的控制场景,这可能对您来说是个问题:您想要检查可视化树...

(问题 2)这很令人困惑。 (以上两个陈述是矛盾的)或(有可能构建一个FrameworkElement并将其添加到对象树中并且尚未应用模板)。后者似乎不太可能,因为第二个 msdn 语句引用了可视化树。请澄清这些陈述中哪些是正确的。 (问题3)另外,“不保证之后发生”是指它可能发生在之前,还是根本不会发生?

【问题讨论】:

    标签: silverlight


    【解决方案1】:

    Loaded 事件只会引发一次,除非您从对象树中删除该对象并稍后重新添加,否则一切都会重新发生。

    我可以确认 Loaded 事件可以在应用模板之前发生。出于这个原因,我在 OnApplyTemplate() 中执行了所有模板和可视化树检查操作,包括任何最后一分钟的初始化。

    “不保证发生后”是指操作的顺序,是的。将对象添加到对象树后总是会加载。

    【讨论】:

    • Sander,您的回复很有帮助,非常感谢。 MS 文档应阅读“每次将框架元素添加到可视化树时发生”我有一个正在处理的菜单控件,它使用弹出控件。我没有明确地将它从可视化树中删除,但它的可见性已被切换(popup.isvisible 设置为 false)。在任何情况下,加载的事件都会发生不止一次。但是第二次出现此错误:“元素已经是另一个元素的子元素”。这让我相信它没有从可视化树中删除,所以我不明白发生了什么。
    • 有趣。也许在您的场景中,某个祖先在对象树中移动,而不是控件本身。这也将导致您的控件(以及重新添加的树部分中的所有其他控件)引发 Loaded 事件。如果您有更多关于错误发生的确切位置(什么是调用的方法以及何时调用)的更多信息,我可能会提供进一步的帮助。
    • 我还建议您处理 Unloaded 事件 - 这可能会为您提供一些关于何时/为何从树中移除对象的线索(以及从什么移除)。每次从对象树中删除您的对象或祖先时,都会引发 Unloaded。
    • 好的,现在的问题是什么时候从可视化树中移除一个对象?我不会做任何我知道的移除或移动,除非切换可见性算作移除。 “每次从对象树中删除您的对象或祖先时,都会引发 Unloaded。”对象树还是视觉树?顺便说一句,我在我的类中添加了一个计数器,该计数器在加载时递增,在卸载时递减。他们似乎按照你说的那样工作,我仍然找不到错误的原因。
    • 我的意思是对象树,是的。据我所知,Loaded/Unloaded 事件与可视化树没有任何特定关系,它们主要与对象树有关。我在这里可能错了,但我对此相当有信心(视觉树在 Silverlight 中对开发人员来说大多是隐藏的,所以一般来说,我建议你忽略它甚至存在,除非围绕内置控件实施一些功能黑客) .切换可见性不应卸载任何控件。尝试在事件处理程序中设置断点并查看这些事件具体何时发生,也许?
    猜你喜欢
    • 1970-01-01
    • 2011-12-14
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-10
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多