【问题标题】:What is the draw order (OnPaint / OnPaintBackground event) in child-parent controls?子父控件中的绘制顺序(OnPaint / OnPaintBackground 事件)是什么?
【发布时间】:2010-09-27 15:47:29
【问题描述】:

使用 C# .NET Compact Framework 我正在创建一个 GUI 控件,其中包含和控制子控件,这些子控件也是自定义控件(即 System.Windows.Forms.UserControl)。孩子和父母都有自定义绘图例程(OnPaint)。为了更好地理解和优化绘图例程,我想澄清一下 .NET 下的绘图顺序。

(1) 第一次显示整个事件时,下列事件的正确顺序是什么:

  • parent.OnPaintBackground

  • child.OnPaintBackground

  • parent.OnPaint

  • child.OnPaint

(2) Control.Invalidate() 调用的顺序会影响 OnPaint / OnPaintBackground 事件的顺序吗?

(3) 如果子控件调用自己的child.Invalidate(),父控件是否也得到OnPaint/OnPaintBackground事件?

(4) 系统如何确定哪个控件是哪个子控件的父控件,反之亦然? Control.Parent 是这种关系的唯一指示吗?

【问题讨论】:

    标签: c# .net user-interface


    【解决方案1】:

    这不是一个真正的答案,但您可以使用一些 Debug.Print() 语句并编写一个快速程序来自己测试 1-3。将订阅者添加到您感兴趣的事件并查看它们何时发生。然后按照您在 2-3 中的建议进行操作,并更改 Invalidate() 调用的顺序并观察。

    就像我说的,这不是一个答案,而是一种发现答案的方式。

    至于#4,就像你暗示的那样,这种关系是双向的。您已经与Control.Parent(子->父)建立了一半的关系。另一半是Control.Controls 集合(父->子)。根据我的理解,将关系视为一棵无序的大树。

    【讨论】:

    • 感谢您的信息。如果没有人可以在这里给出明确的答案,那就是方法。日志的问题是我会看到许多可能的行为中的一种。了解一些规则可以更智能地实施。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-09
    • 2017-11-23
    • 1970-01-01
    • 2020-02-09
    • 2021-12-04
    相关资源
    最近更新 更多