当 AutoScroll 选项打开时,如何防止控件上元素的自动重新排列?

How can automatic rearrangement of elements on the control be prevented when AutoScroll option is on?

上下文:
我有一个主用户控件,其中包含一个 window 和另一个(不同的)用户控件的实例。在 window 中,我正在显示一个可以缩放的对象。对于缩放,我使用鼠标滚轮。在这个window之外,鼠标滚轮控制页面滚动,正因为如此,当我的鼠标在window里面,当主控件的AutoScroll选项设置为True时,这两个动作同时发生(对象移动和页面滚动)。因此,我在鼠标位置位于 window 内时禁用 AutoScroll,并在鼠标离开 window.

时再次启用它

问题:
当鼠标离开 window 时,表单上的元素会自动重新定位(下图中的前后)。

到目前为止我尝试过的:
我尝试在这个自动改变之后改变每个元素的位置,最后的结果是可以的,但是我无法避免两个“事件”(自动位置改变和手动位置改变)之间的延迟所以我得到了一个闪现之间的自动重新定位。 当我离开显示滚动条时,即使它被禁用(作为占位符)也会发生这种转变 - 但是右侧的按钮不会移动,只是中间的表格会降低,如图所示。

我也试过在 window 和主窗体之间切换后跳过第一个 OnPaint 事件,但问题仍然存在。

ImageBeforeRearrangement:

ImageAfterRearrangement:

根据鼠标位置允许和禁止在窗体或用户控件上滚动:

    private void ucSomething_MouseEnter(object sender, EventArgs e)
    {
        bScrollAllowed = true;
    }

    private void ucSomething_MouseLeave(object sender, EventArgs e)
    {
        bScrollAllowed = false;
    }

然后根据 bScrollAllowed 字段阻止 Windows 消息:

    protected override void WndProc(ref Message m)
    {
        if (m.Msg == 0x20a && !bScrollAllowed)
        {
            return;
        }
        base.WndProc(ref m);
    }