当 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);
}
上下文:
我有一个主用户控件,其中包含一个 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);
}