首页 文章

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

提问于
浏览
18

我正在寻找一个图表,作为参考,显示事件和覆盖的顺序,这些事件和覆盖调用WPF自定义控件,这些控件派生自通用类,如FrameworkElement,UIElement,Control,ContentControl,Decorator等 .

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

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

我也见过this page,在我看来这看起来太简单了 . 那个页面似乎基本上说只有 InitializedLoadedUnloaded 事件 . 为了说明,我需要在自定义控件中使用的一些常规事件/覆盖包括:

  • 构造函数

  • 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 回答

  • 1

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

  • 1
    • Initialised仅被调用一次,并且首先被调用

    • OnApplyTemplate被调用为秒,并且每当模板更改时

    • 当控件准备好显示时以及每当某些容器重新加载其内容时(特别是在TabItem之间交换),将调用Loaded
      只要可见性发生变化,加载后就会调用

    • IsVisibleChanged

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

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

相关问题