Resize和SizeChanged事件之间的区别

时间:2011-09-16 07:26:37

标签: c# winforms user-controls

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

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

3 个答案:

答案 0 :(得分:23)

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

您可以使用其中之一,因为调整大小会导致Size属性发生更改。但是,您应该按照ResizeSizeChanged事件的文档中的建议使用Layout事件。

答案 1 :(得分:14)

So what IS the difference between the Resize and the SizeChanged events?

  

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

答案 2 :(得分:9)

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

SizeChanged将

SizeChanged引发了OnSizeChanged()事件。此功能仅由UpdateBounds()调用,由多种机制调用,主要包括处理WM_MOVEWM_WINDOWPOSCHANGED消息。

从源头开始,OnSizeChanged()仅在UpdateBounds()确定旧尺寸新尺寸。所以,是的,正如其他人已经确定的那样,SizeChanged事件对应于Size属性的变化。

调整大小

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

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

但是,如果您继承Control,则必须注意以下差异:

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

LocationChanged and Move

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

这种差异可能只对控制作者有用。

结论

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

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

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

    旁注: "其他变更"是模糊的,但我认为Microsoft指的是需要布局的继承者采取的任何行动。

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