【问题标题】:How to trigger an Control.Resize event without actually resizing?如何在不实际调整大小的情况下触发 Control.Resize 事件?
【发布时间】:2009-02-05 10:36:34
【问题描述】:

我没有对控件进行子类化。尝试通过Control.Size = Control.Size 触发事件失败,因为它不会触发,除非新大小实际上不同。

【问题讨论】:

  • 如果您不调整控件的大小,那么为什么要调整大小!?
  • 如果你想重绘控件然后做Control.Invalidate()
  • 我有一个观察者在等待调整大小。将观察者更改为等待重绘是不合适的,因为它只是调整内部控件的大小。

标签: c# winforms events resize controls


【解决方案1】:

如果你是Control的子类,你可以直接调用OnResize,或者暴露在API上:

 public void OnResize() {
     this.OnResize(EventArgs.Empty);
 }

但是,您不能对任意控件执行此操作。您可以来回更改Size 吗?或者,您可以使用反射,但那是 hacky:

 typeof (Control).GetMethod("OnResize",
     BindingFlags.Instance | BindingFlags.NonPublic)
     .Invoke(myControl, new object[] {EventArgs.Empty});

【讨论】:

  • 反射是可能的,但这可能有点矫枉过正,而且感觉很丑。
【解决方案2】:

我总是通过调用控件的 Resize 事件处理程序来做到这一点:

control_Resize(null, null);

【讨论】:

    【解决方案3】:

    您为什么要这样做,在什么情况下?例如,当您在控件本身中(即在您的派生控件类中)时,您可以调用 OnResize。 (或者通过反射,当你在外面时。)

    除此之外,您可能还必须更改控件的大小,因为这就是 Resize 事件的用途:)

    【讨论】:

      【解决方案4】:

      只需使用以下命令更改控件的大小:Control.Size = new Size(x,y);

      更改控件的大小将为该控件发出一个调整大小事件,并且该控件应调整大小。

      或者,如果您只想重绘控件,请执行以下操作: Control.Invalidate();

      【讨论】:

      • 这是不正确的。设置新的大小不会为该控件发出调整大小事件。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-26
      • 2011-03-12
      • 1970-01-01
      • 2015-03-06
      • 1970-01-01
      • 2023-02-05
      • 2015-08-11
      相关资源
      最近更新 更多