【问题标题】:Difference between Resize and SizeChanged eventsResize 和 SizeChanged 事件之间的区别
【发布时间】:2011-11-18 11:28:26
【问题描述】:

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

我正在用 C# 创建一个用户控件。此控件包含一个文本框。 当用户更改控件的大小时,我想调整文本框的大小。 我不知道应该使用哪个事件以及为什么?

【问题讨论】:

    标签: c# winforms user-controls


    【解决方案1】:

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

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

    【讨论】:

    • 但是调整我的控件大小时不会出现布局
    • @Haider Ali:这很奇怪。该事件在“当控件的边界发生变化时”触发:msdn.microsoft.com/en-us/library/…
    • 是的,你是对的,这个链接真的帮助了我,这正是我正在寻找的。非常感谢。
    • 应该首选有关 LayoutChanged 的​​精彩提示!
    【解决方案2】:

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

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

    【讨论】:

    • 是的,没错,Size 是一个属性,对于每个属性,.Net 都为 changed 事件提供了一个事件,因此 sizechanged 事件与其属性相关联以进行数据绑定。感谢您的回复
    • 好吧,我发现它完全不同:如果我在Resize 事件结束时更改图像/背景图像,它就不起作用,就好像我中止了事件一样。如果我将相同的代码移至SizeChanged,一切都会按预期工作。
    【解决方案3】:

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

    尺寸变化

    SizeChanged 事件由OnSizeChanged() 引发。这个函数又只被UpdateBounds()调用,它被多种机制调用,主要包括WM_MOVEWM_WINDOWPOSCHANGED消息的处理。

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

    调整大小

    Resize 事件不同的,但差别不大。它由OnResize() 提出。此函数作为OnSizeChanged() 的直接结果调用。然而,反过来是不正确的。也就是说,OnResize()调用OnSizeChanged()

    不同之处在于您使用这些 API 的角度。如果您只是订阅这些事件,那么几乎没有区别。不管你怎么看,只要控件的大小发生变化,两个事件都会触发。

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

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

    位置改变和移动

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

    同样,这种差异可能只对控制作者很重要。

    结论

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-07
      • 2020-06-09
      • 2021-05-07
      • 2021-06-01
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多