c#检测窗口是否真的调整了大小而不是移动了

c#检测窗口是否真的调整了大小而不是移动了,c#,winforms,window-resize,C#,Winforms,Window Resize,在我的winform程序中,我需要检测表单何时调整大小:但是当表单被简单地移动到桌面中时,ResizeEnd方法也被调用 是否可以仅在调整窗口大小时进行检查 在我看来,我可以将最后一个宽度和最后一个高度保存到ResizeEnd方法中,如下所示: int lastWidth; int lastHeigth; private void frmMain_ResizeEnd(object sender, EventArgs e) { if (lastHeigth != this.Height |

在我的winform程序中,我需要检测表单何时调整大小:但是当表单被简单地移动到桌面中时,
ResizeEnd
方法也被调用

是否可以仅在调整窗口大小时进行检查

在我看来,我可以将最后一个宽度和最后一个高度保存到
ResizeEnd
方法中,如下所示:

int lastWidth;
int lastHeigth;
private void frmMain_ResizeEnd(object sender, EventArgs e)
{
    if (lastHeigth != this.Height || lastWidth != this.Width)
    {
        lastHeigth = this.Height;
        lastWidth = this.Width;
        fireResize();
    }
}

但这是一个丑陋的解决方案…

检查文档怎么样?如下

当用户开始调整窗体大小时,通常通过单击并拖动窗体右下角的边框或大小调整夹点之一,会引发ResizeBegin事件。此操作将窗体放入模式大小调整循环,直到完成大小调整操作。通常,在调整大小操作期间会发生以下一组事件:

  • 当窗体进入调整大小模式时,将发生一个ResizeBegin事件
  • 修改表单大小时,零对或多对Resize和SizeChanged事件发生
  • 窗体退出调整大小模式时,将发生一个ResizeEnd事件
  • 只需单击而不拖动边框或调整大小夹点,即可生成ResizeBegin和ResizeEnd事件,而无需任何中间Resize和SizeChanged事件对


    当用户移动表单时,通常通过单击并拖动标题栏来引发ResizeBegin和ResizeEnd事件对。这些事件不是通过对表单的编程操作生成的,例如通过更改大小或位置属性。

    为什么不使用此选项?这对我来说很好

     public Form1()
     {
         this.Resize += Form1_Resize;
     }
    
     void Form1_Resize(object sender, EventArgs e)
     {
         // do what you want to do 
     }
    
    在这里读这篇文章

    当用户开始调整窗体大小时,通常通过单击并拖动窗体右下角的边框或大小调整夹点之一,会引发ResizeBegin事件。此操作将窗体放入模式大小调整循环,直到完成大小调整操作。通常,在调整大小操作期间会发生以下一组事件:

    • 当窗体进入调整大小模式时,将发生一个ResizeBegin事件

    • 修改表单大小时,零对或多对Resize和SizeChanged事件发生

    • 窗体退出调整大小模式时,将发生一个ResizeEnd事件

    注: 只需单击而不拖动边框或调整大小夹点,即可生成ResizeBegin和ResizeEnd事件,而无需任何中间Resize和SizeChanged事件对

    当用户移动表单时,通常通过单击并拖动标题栏来引发ResizeBegin和ResizeEnd事件对。这些事件不是通过对表单的编程操作生成的,例如通过更改大小或位置属性


    使用简单的
    调整大小
    事件。它只会在调整大小时触发。

    只比您原来的解决方案稍微好一点,但至少它解决了问题,而不仅仅是引用文档

    很明显,问题在于
    Resize
    一直处于激发状态,因此似乎需要一个标志:

    bool sizing = false;
    private void Form1_ResizeEnd(object sender, EventArgs e)
    {
        if (!sizing) return;
        if (sizing) {sizing = false; /*do your stuff*/ }
    }
    
    private void Form1_Resize(object sender, EventArgs e)
    {
        sizing = true;
    }
    
    当然,在
    ResizeEnd
    EventArgs
    中有一个指示符会很好,但看不到更简单的方法

    顺便说一句,使用
    Size
    代替检查
    Width
    Height
    也是一个小改进