我正在使用C#创建一个用户控件,其中包含一个文本框。当用户更改控件的大小时,我希望调整文本框的大小。我对应该使用哪个事件感到困惑,以及为什么要使用它?
Resize
事件在控件被调整大小时发生,而SizeChanged
事件则在Size
属性改变时发生。Size
属性的更改。但是根据Resize和SizeChanged事件的文档建议,您应该使用Layout
事件。SizeChanged
事件由OnSizeChanged()
引发。该函数则仅被 UpdateBounds()
调用,后者又被多种机制调用,主要包括处理 WM_MOVE
和 WM_WINDOWPOSCHANGED
消息。
同样来自源代码,只有当 UpdateBounds()
确定旧大小和新大小之间存在差异时,OnSizeChanged()
才会被调用。所以,是的,正如其他人已经确定的那样,SizeChanged
事件对应于 Size
属性的更改。
Resize
事件 是 不同的,但区别不大。它由 OnResize()
引发。该函数作为直接结果调用了 OnSizeChanged()
。然而,反过来则不成立。也就是说,OnResize()
不会 调用 OnSizeChanged()
。
区别在于您使用这些 API 的角度。如果您只是订阅这些事件,那么几乎没有区别。无论如何,每当控件的大小改变时,两个事件都会触发。
但是,如果您继承 Control
,则必须注意以下差异:
OnResize()
将 使控件无效,如果样式 ControlStyles.ResizeRedraw
被设置。OnResize()
将触发一个布局,其中 AffectedProperty
设置为 "Bounds"
。例如,有人关心的原因是确保他们的逻辑在基本实现之前执行(因此在无效之前)以正确地绘制到屏幕上。
这是两个移动事件,与 SizeChanged
和 Resize
几乎完全相同。不同之处在于,OnMove()
仅在样式 ControlStyles.SupportsTransparentBackColor
为 true 且背景色不完全是不透明的 alpha 值时才无效。而且,OnMove()
不会触发布局。
同样,这种差异可能只对控件作者有影响。
经过研究源代码后,我的结论是,Resize
和 Move
事件是属性更改事件的一个 抽象,很可能是订阅和重写这些特定事件的首选。
正如其他人所提到的,Layout
事件和OnLayout()
函数也是一个不错的选择;但是,布局可能会在许多实例中发生:
附注: "其他更改"是含糊不清的,但我认为微软指的是继承者采取的任何需要布局的操作。
过于依赖布局事件可能会减慢您的代码/控件,因为它们会比简单的调整大小事件更频繁地发生。或者,布局引擎可能会被SuspendLayout()
挂起,在这种情况下,您将无法通过Layout
事件对大小更改做出反应。
那么“Resize”和“SizeChanged”事件有什么区别呢?
信不信由你,它们完全没有任何区别。其中一个方法调用了另一个方法。然而,由于后者被命名为“Changed”,因此它可用于数据绑定 - 因此,虽然我没有任何具体证据,但这是我对为什么两者都存在的理论。
Resize
事件的结尾更改Image/BackgroundImage
,它就不起作用,就好像我中止了该事件一样。如果我将相同的代码移动到SizeChanged
中,一切都按预期工作。 - TaW