Resize和SizeChanged事件之间的区别

Hai*_*ihi 28 c# user-controls winforms

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

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

Guf*_*ffa 26

Resize,而当控制被调整大小发生事件,SizeChanged事件发生时,当Size属性更改.

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


Muh*_*han 14

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

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


Nic*_*ler 13

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

SizeChanged将

SizeChanged事件由提出OnSizeChanged().该函数又UpdateBounds()被调用,由几种机制调用,主要包括处理WM_MOVEWM_WINDOWPOSCHANGED消息.

再次从源中,OnSizeChanged()只有在UpdateBounds()确定旧大小新大小之间存在差异时才会被调用.所以,是的,正如其他人已经确定的那样,SizeChanged事件对应于Size财产的变化.

调整

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

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

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

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

LocationChanged和Move

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

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

结论

调查到的源代码后,我的结论是,ResizeMove事件是一个抽象远离属性更改事件,并且很可能是两种订阅优先选择和覆盖这些具体的事件.

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

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

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

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