我有一个显示乘客座位布局的用户控件。当控件调整大小时,Winforms自动滚屏会丢失
根据乘用车的大小,它可以简单地在矩阵中绘制几个“SeatControl”。
为了更好地查看,主控件调整“SeatControl”以适应所有可用空间,这意味着SeatControls将根据可用空间变大或变小。
这工作完美。
但是,当客户区域变得太小时,我们会避免太多缩小控件,或者它们变形并且无法阅读。
在这种情况下,我们打开自动滚动,以便用户可以滚动查看整个布局。但是,如果我们从一个小屏幕(带滚动条)开始,将其最大化(滚动条将隐藏并且座位控件增加大小)并将窗口大小恢复(滚动将回来并且座位控件将缩小到最小尺寸),滚动会丢失。
要清楚,在图像相同的操作:
最大化窗口(仅适用于部分屏幕显示,以避免大图):
而且其恢复(请注意滚动条和客户区域上的布局位置):
此调整大小由代码b elow:
private void FixSizes()
{
if (mModel == null)
return;
this.SuspendLayout();
Size clientSize = this.ClientSize;
Size minimumSize = new Size(SeatUserControl.MinimumDescentSize.Width, SeatUserControl.MinimumDescentSize.Height);
//Here we try to find the best size for the seat user control to fit all the client area
Size controlSize = new Size(
Math.Max(clientSize.Width/mModel.Length, minimumSize.Width),
Math.Max(clientSize.Height/mModel.Width, minimumSize.Height)
);
AutoScrollMinSize = new Size(controlSize.Width * mModel.Length, controlSize.Height * mModel.Width);
this.SetDisplayRectLocation(0, 0);
for (int row = 0; row < mModel.Width; ++row)
{
for (int col = 0; col < mModel.Length; ++col)
{
Control control = this.Controls[(row * mModel.Length) + col];
control.Location = new Point(col * controlSize.Width, row * controlSize.Height);
control.Size = controlSize;
}
}
this.ResumeLayout();
}
而且这种方法是简单的由OnClientSizeChanged方法叫:
protected override void OnClientSizeChanged(EventArgs e)
{
base.OnClientSizeChanged(e);
this.FixSizes();
}
我能够确定,如果我保持SeatControl上一个固定的大小,问题消失,但输出不太好,因为我们更喜欢SeatControl使用最大可用空间。
所以它看起来像我失踪或忘记做自动滚动设置的东西,所以它不会迷路。有任何想法吗?
+1问题详细信息 – Rafal 2012-07-13 13:08:19
您是否尝试将面板的Dock设置拉伸,以防您正在使用面板进行座位布局? – 2012-07-13 13:42:38
@SivaGopal:我没有,SeatControl直接插入UserControl。但是如果我使用码头,我会失去滚动,对吧? – bcsanches 2012-07-13 13:45:53