26

我正在寻找一个图表,该图表将用作参考,以显示 WPF 自定义控件调用的事件顺序和覆盖,这些自定义控件派生自 FrameworkElement、UIElement、Control、ContentControl、Decorator 等常见类。

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

我正在寻找的是类似于此图的内容(此类图解释了 WPF窗口应用程序的生命周期),但用于自定义控件。

我也看过这个页面,在我看来,这看起来太简单了。该页面似乎基本上说只有Initialized,LoadedUnloaded事件。为了说明,我需要在自定义控件中使用的一些一般事件/覆盖包括:

  • 构造函数
  • Loaded
  • UnLoaded
  • IsVisibleChanged
  • OnApplyTemplate

以及更专业的覆盖,如 Popup'sOnOpened和 Expander'sOnExpanded等。

我遇到的问题是我忘记了我什么时候可以做这样的事情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. (控件现在完全可见并可以与之交互)
4

2 回答 2

2
  1. Initialized 只被调用一次
  2. OnApplyTemplate 被调用第二个,每当模板发生变化时
  3. 当控件准备好显示以及某些容器重新加载其内容(特别是在 TabItem 之间交换)时调用 Loaded
  4. 每当可见性改变时调用 IsVisibleChanged,加载后

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

不幸的是,加载/卸载事件不会被调用,这使得判断控件何时应该处理它的资源变得很棘手。我也从未设法找到卸载和重新加载其内容的容器列表。

于 2017-04-20T21:37:34.370 回答
2

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

于 2017-03-20T19:40:09.550 回答