我有一个用户控件,用于显示客车的座位布局。
它简单地以矩阵方式绘制多个“SeatControl”,具体取决于乘客车大小。
为了更好地查看,主控件调整“SeatControl”以适应所有可用空间,这意味着根据可用空间,SeatControls会变得更大或更小。
这个完美的运作。
但是,当客户区域太小时,我们避免将控件缩小太多,否则它们会变形且难以阅读。
在这种情况下,我们打开自动滚动,使用户可以滚动查看整个布局。
但是,如果我们从小屏幕开始(带滚动条),将其最大化(滚动条将隐藏并且座位控件会增加大小),然后恢复窗口大小(滚动条将重新出现且座位控件将缩小到最小尺寸),则滚动将丢失。
为了清楚起见,请看以下图片中的相同操作: 最大化窗口(仅显示部分屏幕以避免大图像): 然后将其恢复(请注意滚动条和客户区域上的布局位置): 此调整大小由以下代码控制:
它简单地以矩阵方式绘制多个“SeatControl”,具体取决于乘客车大小。
为了更好地查看,主控件调整“SeatControl”以适应所有可用空间,这意味着根据可用空间,SeatControls会变得更大或更小。
这个完美的运作。
但是,当客户区域太小时,我们避免将控件缩小太多,否则它们会变形且难以阅读。
在这种情况下,我们打开自动滚动,使用户可以滚动查看整个布局。
但是,如果我们从小屏幕开始(带滚动条),将其最大化(滚动条将隐藏并且座位控件会增加大小),然后恢复窗口大小(滚动条将重新出现且座位控件将缩小到最小尺寸),则滚动将丢失。
为了清楚起见,请看以下图片中的相同操作: 最大化窗口(仅显示部分屏幕以避免大图像): 然后将其恢复(请注意滚动条和客户区域上的布局位置): 此调整大小由以下代码控制:
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使用尽可能多的空间。
看起来我忘记或者未设置自动滚动选项,以免丢失信息。有什么想法吗?