WPF自定义控件生命周期图?

时间:2013-02-07 22:03:06

标签: wpf event-handling wpf-controls

我正在寻找一个图表,该图表将作为参考来显示事件和覆盖的顺序,这些事件和覆盖从WPE自定义控件调用,这些控件派生自通用类,如FrameworkElement,UIElement,Control,ContentControl,Decorator等。 / p>

我对处理控制过程变得可见并准备好与之交互的事件和覆盖特别感兴趣。换句话说,我对这个图表并不感兴趣,这个图表显示了可以处理用户与控件交互后可以与之交互的事件,例如MouseLeftButtonDown等。

我正在寻找的是this diagram(这些图解释了WPF 窗口应用程序的生命周期),但是用于自定义控件。

我也看过this page,在我看来,这似乎太简单了。该页面似乎基本上表明主要是InitializedLoadedUnloaded事件。为了说明,我需要在自定义控件中使用的一些常规事件/覆盖包括:

  • 构造
  • Loaded
  • UnLoaded
  • IsVisibleChanged
  • OnApplyTemplate

除了稍微更专业的覆盖,如Popup的OnOpened和Expander的OnExpanded等。

我遇到的问题是我忘记了我可以做VisualStateManager.GoToState(...)之类的事情(OnApplyTemplate是我认为的第一个真正的机会)。我还保持发现我需要使用的事件,例如IsVisibleChanged(当我需要一个控件来执行“重新加载/刷新”状态更改时,当用户返回时,此事件被证明是必要的包含我的控件的选项卡)。所以我一直想知道还有其他这样的事件/覆盖,我真的应该关注自定义控件吗? 这是显示这些事物相互关联的图表的帮助。

考虑到这些类型的事件/覆盖,this Silverlight chart非常接近我正在寻找的内容,但是对于WPF 。该帖子上的一些评论者说,WPF的事件/覆盖与Silverlight不同。 如果是这样,你能指点一下类似的图表吗?

为了进一步说明对这种图表的需求,请考虑我在源自ContentControl的自定义控件上目睹的以下事件序列:

  1. 应用已启动。 (我的自定义控件与初始选项卡位于不同的选项卡中。)
  2. Initialized事件回调名为
  3. Loaded事件回调名为
  4. (我点击包含我的自定义控件的标签页)
  5. IsVisibleChanged事件回调名为
  6. OnApplyTemplate覆盖名为
  7. Loaded事件回调名为
  8. Loaded事件回调再次调用
  9. Loaded事件回调连续第三次被召唤
  10. (控制现已完全可见并准备与之互动)

2 个答案:

答案 0 :(得分:1)

我怀疑存在这样一个全面的图表。你自己做到了怎么样?覆盖您感兴趣的所有方法和/或事件,并在每个覆盖中放置Trace.WriteLine(new StackFrame(1).GetMethod().Name);。您的输出将告诉您调用它们的顺序。

答案 1 :(得分:1)

  1. 初始化仅被调用一次,第一次
  2. OnApplyTemplate被调用为秒,并且每当模板更改时
  3. 当控件准备好显示以及某些容器重新加载其内容时(特别是在TabItem之间交换),将调用Loaded
  4. 只要可见性发生变化,并且在加载
  5. 之后,就会调用IsVisibleChanged

    通常不会调用Unloaded,除非您在TabItem中并且换到另一个。

    当您不期望地遇到加载/卸载的事件时,不会调用它们,这使得控制何时应该处理它的资源变得棘手。我也从未设法找到卸载和重新加载其内容的容器列表。