我正在寻找一个图表,作为参考,显示事件和覆盖的顺序,这些事件和覆盖调用WPF自定义控件,这些控件派生自通用类,如FrameworkElement,UIElement,Control,ContentControl,Decorator等 .
我对控制过程变得可见并准备好与之交互的事件和覆盖特别感兴趣 . 换句话说,我对这个图表并不感兴趣,这个图表显示了可以处理用户在准备好与之交互后与之交互的事件,例如MouseLeftButtonDown .
我正在寻找的是像this diagram(这些图解释了WPF窗口或应用程序的生命周期),但用于自定义控件 .
我也见过this page,在我看来这看起来太简单了 . 那个页面似乎基本上说只有 Initialized
, Loaded
和 Unloaded
事件 . 为了说明,我需要在自定义控件中使用的一些常规事件/覆盖包括:
-
构造函数
-
Loaded
-
UnLoaded
-
IsVisibleChanged
-
OnApplyTemplate
除了稍微更专业的覆盖,如Popup的 OnOpened
和Expander的 OnExpanded
等 .
我遇到的问题是我忘记了什么时候能做 VisualStateManager.GoToState(...)
( OnApplyTemplate
是我认为的第一个真正的机会) . 我还会不断发现我需要使用的事件,例如IsVisibleChanged(当我需要一个控件来执行"reload/refresh"状态更改时,当用户返回包含我的控件的Tab时,此事件被证明是必要的) . 所以我一直想知道还有其他这样的事件/覆盖,我真的要注意自定义控件吗? This is where a diagram that shows these things in relation to each other will help.
考虑到这些类型的事件/覆盖,this Silverlight chart非常接近我正在寻找的, but for WPF . 该帖子上的一些评论者说WPF 's events/overrides are different than Silverlight' s . If so, can you please point me to a similar diagram?
为了进一步说明对这种图的需求,请考虑我在源自ContentControl的自定义控件上目睹的以下事件序列:
-
应用程序已启动 . (我的自定义控件与初始选项卡位于不同的选项卡中 . )
-
Initialized
事件回调调用 -
Loaded
事件回调被调用 -
(我点击包含我的自定义控件的标签)
-
IsVisibleChanged
事件回调调用 -
OnApplyTemplate
覆盖被调用 -
Loaded
事件回调调用 -
Loaded
再次调用事件回调 -
Loaded
事件回调连续第三次调用 -
(控制现在完全可见并准备好与之交互)
2 回答
我怀疑存在这样一个全面的图表 . 你自己做到了怎么样?覆盖您感兴趣的所有方法和/或事件,并在每个覆盖中放置
Trace.WriteLine(new StackFrame(1).GetMethod().Name);
. 您的输出将告诉您它们被调用的顺序 .Initialised仅被调用一次,并且首先被调用
OnApplyTemplate被调用为秒,并且每当模板更改时
当控件准备好显示时以及每当某些容器重新加载其内容时(特别是在TabItem之间交换),将调用Loaded
只要可见性发生变化,加载后就会调用
IsVisibleChanged
除非您在TabItem中并且交换到另一个TabItem,否则通常不会调用Unloaded .
当您不期望地遇到加载/卸载事件时,不会调用加载/卸载事件,这使得控制何时应该处理它的资源变得棘手 . 我也从未设法找到卸载和重新加载其内容的容器列表 .