Resize和SizeChanged事件之间的区别

在Winforms的C#.Net中,我在几乎所有组件中发现了两个事件,Resize()和SizeChanged()。 它们之间有什么区别吗? 如果两个事件都相同,那么为什么C#提供了两个不同的事件?

我在C#中创建一个用户控件。 此控件包含一个文本框。 我想在用户更改控件的大小时调整文本框的大小。 我很困惑我应该使用哪个事件以及为什么?

Resize控件大小时会发生Resize事件,而Size属性更改时会发生SizeChanged事件。

你可以使用其中之一,因为resize会导致Size属性发生变化。 但是,您应该使用Layout事件,如Resize和SizeChanged事件的文档中所建议的那样。

那么Resize和SizeChanged事件之间的区别是什么?

信不信由你。 一种方法调用另一种方法。 然而,因为后者被命名为“已更改”,它可以用于数据绑定 – 所以虽然我没有任何具体的证据,但这是我的理论,为什么两者都存在。

有时这些答案只来自源代码:

SizeChanged将

OnSizeChanged()引发SizeChanged事件。 此函数又由UpdateBounds()调用,由几种机制调用,主要包括处理WM_MOVEWM_WINDOWPOSCHANGED消息。

再次从源代码中,只有在UpdateBounds()确定旧大小新大小之间存在差异时UpdateBounds()调用UpdateBounds() 。 所以,是的,正如其他人已经确定的那样, SizeChanged事件对应于Size属性的更改。

调整

Resize事件不同的,但不是很多。 它由OnResize()引发。 此函数被称为OnSizeChanged()的直接结果。 然而,反之则不然。 也就是说, OnResize() 不会调用OnSizeChanged()

不同之处在于您使用这些API的视角。 如果您只是订阅这些活动,那么几乎没有任何区别。 无论哪种方式你看它,每当控件的大小改变时,两个事件都会触发。

但是,如果要inheritanceControl ,则必须注意以下差异:

  • 如果设置了样式ControlStyles.ResizeRedrawOnResize() 将使控件无效
  • OnResize()将触发AffectedProperty设置为"Bounds"的布局。

例如,人们可能关心的原因是确保在基本实现之前(因此在无效之前)执行它们的逻辑以正确地绘制到屏幕上。

LocationChanged和Move

这两个移动事件几乎相同地与SizeChangedResize并行。 例外情况是OnMove()仅在样式ControlStyles.SupportsTransparentBackColortrue且背景OnMove()小于不透明的alpha值时失效。 并且, OnMove()不会触发布局。

同样,这种差异可能只对控制作者有意义。

结论

在调查源代码之后,我的结论是ResizeMove事件是远离属性更改事件的抽象 ,并且可能是订阅和覆盖这些特定事件的首选。

正如其他人OnLayout()Layout事件和OnLayout()函数也是一个不错的选择; 但是,布局可能在许多情况下发生:

  • 添加/删除子控件时。
  • 当控件的边界发生变化时。
  • 当发生可能影响控件布局的其他更改时。

    旁注: “其他更改”含糊不清,但我认为Microsoft指的是需要布局的inheritance者所采取的任何操作。

过于依赖布局事件可能会降低代码/控制速度,因为它们比简单的resize事件更频繁地发生。 或者, SuspendLayout()可能会挂起布局引擎,在这种情况下,您将无法通过Layout事件对大小更改做出反应。