c#检测窗口是否真的调整了大小而不是移动了
在我的winform程序中,我需要检测表单何时调整大小:但是当表单被简单地移动到桌面中时,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 |
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和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事件
使用简单的
调整大小
事件。它只会在调整大小时触发。只比您原来的解决方案稍微好一点,但至少它解决了问题,而不仅仅是引用文档
很明显,问题在于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
也是一个小改进