乗用車の座席レイアウトを表示するユーザーコントロールがあります。
乗用車のサイズに応じて、いくつかの「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で使用可能な最大のスペースを使用することをお勧めするため、出力はそれほど良くありません。
ですから、自動スクロール設定で何かをするのを忘れているか、忘れているように見えます。そうすれば、それが失われることはありません。何か案は?