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

29

我正在寻找一张图表,用作参考,展示基于常见类(例如FrameworkElement、UIElement、Control、ContentControl、Decorator等)派生的WPF自定义控件调用的事件和重写的顺序。

我特别关注与控件变得可见并准备好进行交互的过程有关的事件和重写。换句话说,我对这张图表展示控件在准备好进行交互之后处理用户交互的事件不是很感兴趣,例如像MouseLeftButtonDown这样的事件。

我所要寻找的是类似这个图表的东西(这些图表解释了WPF窗口或应用程序的生命周期),但是是针对自定义控件的。

我也看到过这个页面,但它让人觉得太简单了。那个页面似乎基本上只有Initialized、Loaded和Unloaded事件。举例来说,我需要利用自定义控件中的一些通用事件/重写,包括:

  • Constructor
  • Loaded
  • UnLoaded
  • IsVisibleChanged
  • OnApplyTemplate

还有一些稍微特殊一点的重写,例如Popup的OnOpened和Expander的OnExpanded等。

我遇到的问题是,我忘记了什么时候可以执行像VisualStateManager.GoToState(...)这样的操作(我认为OnApplyTemplate是第一个真正的机会)。 我还不断发现需要利用的事件,例如IsVisibleChanged(当我需要控件在用户返回包含我的自定义控件的选项卡时进行“重新加载/刷新”状态更改时,此事件被证明是必要的)。 所以我一直在想,是否还有其他应该特别关注的类似事件/重写? 这就是显示它们相互关系的图表将有所帮助的地方。
考虑到这些类型的事件/重写,这个Silverlight图表与我所寻找的相当接近,但适用于WPF。那篇文章的一些评论者说,WPF的事件/重写与Silverlight的不同。如果是这样,请您指出类似的图表。
为了进一步说明需要这样的图表,请考虑我刚刚在派生自ContentControl的自定义控件上看到的事件序列:
1. 应用程序启动。(我的自定义控件在不同的选项卡中。) 2. 调用Initialized事件回调。 3. 调用Loaded事件回调。 4. (我点击包含我的自定义控件的选项卡。) 5. 调用IsVisibleChanged事件回调。 6. 调用OnApplyTemplate重写。 7. 调用Loaded事件回调。 8. 再次调用Loaded事件回调。 9. 连续第三次调用Loaded事件回调。 10.(控件现在完全可见并准备好与之交互。)

@bitbonk 这可能是个好主意……不过我已经不再使用 WPF 了,所以无法确认是否可行。 - Jason Frank
@bitbonk,您能将其发布为此问题的答案吗(根据此元线程)?谢谢! - Matt Thomas
https://learn.microsoft.com/en-us/dotnet/desktop/wpf/advanced/object-lifetime-events?view=netframeworkdesktop-4.8 - Boppity Bop
2个回答

2
  1. Initialised方法只会被调用一次,且在第一位。
  2. OnApplyTemplate方法会在第二位被调用,并在模板更改时被调用。
  3. Loaded方法会在控件准备好显示时被调用,并在某些容器重新加载其内容时被调用(特别是在选项卡之间切换时)。
  4. IsVisibleChanged方法会在可见性更改后被调用,在Loaded方法之后被调用。

通常情况下,Unloaded方法不会被调用,除非您在TabItem中并且切换到另一个TabItem。

遗憾的是,Loaded/Unloaded事件并不总是在您期望的时间被调用,这使得很难确定何时应该释放控件的资源。我也从未找到过哪些容器会卸载和重新加载其内容的列表。


2

我怀疑这样一个全面的图表并不存在。你可以自己制作一个吗?覆盖所有你感兴趣的方法和/或事件,并在每个覆盖中加入Trace.WriteLine(new StackFrame(1).GetMethod().Name);,输出将告诉你它们被调用的顺序。


可能是个好主意……不过我已经不再使用WPF了,所以无法确认正确性。 - Jason Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接