Resize和SizeChanged事件之间的区别

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Resize和SizeChanged事件之间的区别相关的知识,希望对你有一定的参考价值。

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

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

答案

当控件调整大小时会发生Resize事件,而当SizeChanged属性发生变化时会发生Size事件。

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

另一答案

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

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

另一答案

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

SizeChanged

SizeChanged事件由OnSizeChanged()提出。这个函数反过来只被UpdateBounds()调用,它由几种机制调用,主要包括处理WM_MOVEWM_WINDOWPOSCHANGED消息。

再次从源头开始,只有在OnSizeChanged()确定旧尺寸和新尺寸之间存在差异时才会调用UpdateBounds()。所以,是的,正如其他人已经确定的那样,SizeChanged事件对应于Size属性的变化。

Resize

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

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

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

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

LocationChanged and Move

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

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

Conclusions

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

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

  • 添加/删除子控件时。
  • 当控件的边界发生变化时。
  • 当发生可能影响控件布局的其他更改时。 旁注:“其他更改”含糊不清,但我认为Microsoft指的是需要布局的继承者所采取的任何操作。

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

以上是关于Resize和SizeChanged事件之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

2021-11-22 WinFrom面试题 Form窗体的常用事件有哪些?

.NET WPF 记住会话之间的窗口大小

C# 实现WinForm窗口最小化到系统托盘代码,并且判断左右鼠标的事件

cv2.resize()和transform.resize()的区别

vb窗体中的resize是啥事件?

编写高质量代码改善C#程序的157个建议——建议139:事件处理器命名采用组合方式