WinForms -resize事件后的操作

hc2pp10m  于 2022-11-17  发布在  其他
关注(0)|答案(5)|浏览(174)

是否可以在(用户控件的)resize事件之后执行一个特定的操作,例如当鼠标按钮被释放时?我需要手动调整内部控件的大小,并且在每次触发事件时都这样做是相当,嗯,效率低下的...

yvgpqqbh

yvgpqqbh1#

只需使用ResizeEnd事件:

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

来自MSDN:
ResizeEnd事件在用户完成窗体大小调整(通常是通过拖动位于窗体右下角的一个边框或调整大小手柄,然后释放它)时引发。有关调整大小操作的更多信息,。

cvxl0en2

cvxl0en22#

您可以像下面这样伪造一个本地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
        //...
    }

}

间隔可以修改。间隔越大,在最后一次调整大小事件之后的延迟越长。

icomxhvb

icomxhvb3#

如果您使用的是控件而不是窗体,并且希望在完成调整大小后(用户停止调整控件大小)执行操作,则可以使用另一个选项:

private int resizeTimeout = 0;
private Task resizeTask;

public void OnResize()
{
  resizeTimeout = 300; //Reset timeout
  //Only resize on completion. This after resizeTimeout if no interaction.
  if (resizeTask == null || resizeTask.IsCompleted)
  {
    resizeTask = Task.Run(async () =>
    {
      //Sleep until timeout has been reached
      while (resizeTimeout > 0)
      {
        await Task.Delay(100);
        resizeTimeout -= 100;
      }
      ResizeControl();
    });
  }
}

private void ResizeControl()
{
  if (this.InvokeRequired)
  {
    //Call the same method in the context of the main UI thread.
    this.Invoke((MethodInvoker)delegate { ResizeControl(); });
  }
  else
  {
    // Do resize actions here
  }
}
pnwntuvh

pnwntuvh4#

也许你可以使用SizeChanged事件,但是我不知道在调整大小的过程中多久或者什么时候调用它。

gz5pxeao

gz5pxeao5#

一个简单的解决方案是重写窗体中的OnResize并防止它调用基方法。
请改为在OnResizeEnd阶段开始时调用此基方法。

protected override void OnResize(EventArgs e)
        {
            // base.OnResize(e);
        }

        protected override void OnResizeEnd(EventArgs e)
        {
            base.OnResize(e);
            base.OnResizeEnd(e);
        }

最大化或还原的表单只能在OnResize中检测。
为了适应这种情况,您需要跟踪窗口状态,并允许OnResize在窗口状态更改时继续执行:

private FormWindowState _LastWindowState;

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);
            _LastWindowState = WindowState;
        }

        protected override void OnResize(EventArgs e)
        {
            if (WindowState != _LastWindowState)
            {
                base.OnResize(e);
                _LastWindowState = WindowState;
            }
        }

        protected override void OnResizeEnd(EventArgs e)
        {
            base.OnResize(e);
            base.OnResizeEnd(e);
        }

另一方面,使用这样的代码应该是最后的手段。控件自然调整大小的问题通常表明设计/编码不好。

相关问题