调整大小事件和大小更改事件的区别

40
在C# .Net Winforms中,我发现几乎所有组件都有两个事件:Resize()和SizeChanged()。它们有什么区别吗?如果这两个事件是相同的,那么为什么C#提供了两个不同的事件?
我正在使用C#创建一个用户控件,其中包含一个文本框。当用户更改控件的大小时,我希望调整文本框的大小。我对应该使用哪个事件感到困惑,以及为什么要使用它?
3个回答

34
Resize事件在控件被调整大小时发生,而SizeChanged事件则在Size属性改变时发生。
您可以使用其中任意一个事件,因为调整大小将导致Size属性的更改。但是根据ResizeSizeChanged事件的文档建议,您应该使用Layout事件。

但是当我调整控件大小时,布局并没有发生。 - Haider Ali Wajihi
@Haider Ali:很奇怪。根据这个链接:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.layout.aspx,事件是在“控件边界改变时”触发的。 - Guffa
是的,你说得对,这个链接确实帮了我很多,这正是我正在寻找的。非常感谢你。 - Haider Ali Wajihi
布局更改(LayoutChanged)应该被优先考虑,这是一个很好的提示! - Amir Mahdi Nassiri

19
有时候只有从源代码才能找到答案:

SizeChanged

SizeChanged 事件由OnSizeChanged()引发。该函数则仅被 UpdateBounds()调用,后者又被多种机制调用,主要包括处理 WM_MOVEWM_WINDOWPOSCHANGED 消息。

同样来自源代码,只有当 UpdateBounds() 确定旧大小和新大小之间存在差异时,OnSizeChanged() 才会被调用。所以,是的,正如其他人已经确定的那样,SizeChanged 事件对应于 Size 属性的更改。

Resize

Resize 事件 不同的,但区别不大。它由 OnResize() 引发。该函数作为直接结果调用了 OnSizeChanged()。然而,反过来则不成立。也就是说,OnResize() 不会 调用 OnSizeChanged()

区别在于您使用这些 API 的角度。如果您只是订阅这些事件,那么几乎没有区别。无论如何,每当控件的大小改变时,两个事件都会触发。

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

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

LocationChanged 和 Move

这是两个移动事件,与 SizeChangedResize 几乎完全相同。不同之处在于,OnMove() 仅在样式 ControlStyles.SupportsTransparentBackColortrue 且背景色不完全是不透明的 alpha 值时才无效。而且,OnMove() 不会触发布局。

同样,这种差异可能只对控件作者有影响。

结论

经过研究源代码后,我的结论是,ResizeMove 事件是属性更改事件的一个 抽象,很可能是订阅和重写这些特定事件的首选。

正如其他人所提到的,Layout事件和OnLayout()函数也是一个不错的选择;但是,布局可能会在许多实例中发生:

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

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

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


13

那么“Resize”和“SizeChanged”事件有什么区别呢?

信不信由你,它们完全没有任何区别。其中一个方法调用了另一个方法。然而,由于后者被命名为“Changed”,因此它可用于数据绑定 - 因此,虽然我没有任何具体证据,但这是我对为什么两者都存在的理论。


是的,Size是一个属性,对于每个属性,.Net都提供了一个<propertyname>changed事件,因此sizechanged事件与其属性相关联以进行数据绑定。谢谢您的回复。 - Haider Ali Wajihi
我发现它有些不同:如果我在Resize事件的结尾更改Image/BackgroundImage,它就不起作用,就好像我中止了该事件一样。如果我将相同的代码移动到SizeChanged中,一切都按预期工作。 - TaW

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接