问题 WinForms - 调整大小事件后的操作


是否可以执行特定操作  resize事件(用户控件),例如释放鼠标按钮时?我需要手动调整内部控件的大小,并且在事件的每次触发时执行它都会非常,嗯,效率低......


9473
2018-06-21 08:42


起源

有更好的方法来进行控制布局。 - leppie
我知道,我不会这样做,但这是一个小特例;) - brovar
有什么不对的 Control.Resize 事件? - leppie
@leppie - 在用户调整窗口大小期间,Resize会多次发生。他想要在用户完成调整大小时发生的事件。 - GenericTypeTea
没错,谢谢Generic。 - brovar


答案:


只需使用 ResizeEnd 事件:

private void Form1_ResizeEnd(object sender, EventArgs e)
{
   // Your code here
}

来自MSDN:

当引发ResizeEnd事件时   用户完成调整表单的大小,   通常通过拖动其中一个   边框或尺寸调整手柄位于   表格的右下角,   然后释放它。更多   有关调整大小的信息   操作。


9
2018-06-21 08:52



非常诱人,我可能已经使用过它,但它发生在用户控件中(我忘了指定,抱歉),我无法访问表单的事件。 - brovar
@brovar:那是胡扯!每个控件都有一个 ParentForm 属性。所以事实上你有所有可访问的! - leppie
@为什么你不能只添加一个 ResizeMeNow() 用户控件的方法并在Form上调用它 ResizeEnd 事件? - GenericTypeTea
@brovar - 或者像leppie说的那样,你可以挂钩到UserControl.ParentForm.ResizeEnd + = ...等。 - GenericTypeTea
是的,我确实有ParentForm,但在Handles和AddHandler之后无法访问它在这个应用程序的代码中不受欢迎。 (是的,VB.NET,而不是c#) - brovar


你可以伪造一个像这样的本地ResizeEnd:

public class Dummy:UserControl
{

    private readonly Timer _tDelayedResize;

    public Dummy()
    {
        this.Resize += this_Resize;
        _tDelayedResize = new Timer();
        _tDelayedResize.Interval = 5;
        _tDelayedResize.Tick += this_ResizeEnd;
    }

    void this_Resize(object sender, EventArgs e)
    {
        _tDelayedResize.Stop();
        _tDelayedResize.Start();
    }

    void this_ResizeEnd(object sender, EventArgs e)
    {
        _tDelayedResize.Stop();

        //Do your ResizeEnd logic here
        //...
    }

}

间隔可以修改。它越高,最后一次调整大小事件后的延迟就越多。


1
2018-05-22 13:51





也许你可以使用 SizeChanged将 事件。但我不知道在调整大小期间调用它的频率或时间。


0
2018-06-21 09:13



就像Resize一样,一次又一次。 - brovar