3

乗用車の座席レイアウトを表示するユーザーコントロールがあります。

乗用車のサイズに応じて、いくつかの「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で使用可能な最大のスペースを使用することをお勧めするため、出力はそれほど良くありません。

ですから、自動スクロール設定で何かをするのを忘れているか、忘れているように見えます。そうすれば、それが失われることはありません。何か案は?

4

1 に答える 1

2

コメントからの解決策:

パネルなどのある種の親コンテナ、またはSeatControlの最大サイズを制限するものを使用していると仮定すると、ドック「Fill」(中央のコンテナ)を使用します。これにより、コントロールに関してスクロールバーが自動調整されます。

将来の読者にとって、Dock:Fillプロパティを使用すると、結果は次のようになります。

ここに画像の説明を入力してください

gridviewコントロールが親コンテナよりも大きいために自動生成されたスクロールバーに注意してください。

于 2012-07-13T14:59:13.870 に答える