当窗体停止移动时,C# 中是否有任何事件触发。不是在它移动的时候。
如果没有事件,有没有办法用 WndProc 做到这一点?
ResizeEnd 事件在移动结束后触发。也许你可以使用它。
这不是故障安全解决方案,但它是纯 .NET,而且非常简单。在表单中添加一个计时器,将其设置为相对较短的延迟(100-150 毫秒对我来说似乎没问题)。为 Form.LocationChanged 和 Timer.Tick 事件添加以下代码:
private void Form_LocationChanged(object sender, EventArgs e)
{
if (this.Text != "Moving")
{
this.Text = "Moving";
}
tmrStoppedMoving.Start();
}
private void Timer_Tick(object sender, EventArgs e)
{
tmrStoppedMoving.Start();
this.Text = "Stopped";
}
如果您想要更精确的处理(确切知道鼠标按钮何时在标题栏中释放等),您可能需要深入监控 Windows 消息。
我对用户控件有同样的问题,但它没有 ResizeEnd 事件。有效的解决方案是覆盖 WndProc 方法并监听 EXITSIZEMOVE。
在此处查看示例
当 onmove 事件被触发时,只需将标志设置为 true。如果发生 mouseup 事件并且标志为真,则窗体停止移动。
我承认这在用户通过键盘移动表单的情况下可能不起作用,但这种情况很少见。
我测试了 ResizeChanged 事件,它工作正常,但是我不知道移动和调整大小之间的关系,但它对我有用