9

一般的な問題

アプリケーションは C# WinForms .Net 4.0 です。

フォームの大部分を占めるがSplitContainerあります。すべての方向にアンカーに設定されているため、フォームに合わせてサイズが変更されます。左側のパネル (Panel1) にはシンプルなメニューがあり、ここでは問題ありません。右側のパネル (Panel2) はより複雑で、多数のネストされたタブ コントロール (多くのコントロールを含む) が含まれています。これは非常に複雑ですが、変更されていません。

問題は、フォームのサイズ変更がうまく機能しないことです。実際、エッジをゆっくりとドラッグしてサイズを変更すると問題なく動作しますが、すばやくドラッグするか、「復元」ボタン (フォームの右上) を使用すると問題が発生します。


私のコントロール階層

以下は、私のコントロール階層の簡単な例です。間違いなく削減されたバージョンですが、複製に役立つネストされたタブ コントロールが強調表示されています。

    • 分割コンテナ (アンカー: 上、左、下、右)
      • SC Panel1 (最小幅: 300)
        • TreeViewControl (名前は忘れてください)
      • SC パネル 2
        • パネル (アンカー: 上、左、下、右)
          • タブ コントロール (アンカー: 上、左、下、右)
            • 画面をオーバーフローし、ナビゲーション ボタンを右上隅に表示する必要があるページが多数あるタブ コントロール (アンカー: 上、左、下、右)

デバッグの詳細

いくつかのデバッグの後、実際にはPanel2(分割コンテナーの子) が適切にサイズ変更されていないように見え、実際のSplitContainerサイズ自体は正常にサイズ変更されます。

これを示すデバッグ値は次のとおりです...

サイズ変更前の全幅フォーム:

splitContainerMain.Width: 1479
splitContainerMain.Panel2.Width: 1206
panelCenter.Width: 1203
tabControlMain.Width: 1215

すべて予想通り、splitContainerMain.Panel2.Widthより小さいですsplitContainerMain.Width

問題が発生する場所のサイズを変更した後:

splitContainerMain.Width: 815
splitContainerMain.Panel2.Width: 1206
panelCenter.Width: 1203
tabControlMain.Width: 1215

ご覧のとおり、splitContainerMain.Widthは希望どおりにサイズ変更されていますが、splitContainerMain.Panel2.Widthとその後の子は変更されていません。

:フォームのサイズを手動でゆっくりと変更すると、幅が正しく更新されることを覚えておいてください。これは、アンカーを正しく設定していなくても問題ありません。


これまでの取り組み

私がやろうとしたことは、さまざまなフォームのサイズ変更イベントを使用して、幅を手動で設定しようとしましたが、役に立ちませんでした。私が試したいのはPanel2.Width、何らかのイベント内から値を設定することだと思います。


私が探しているもの

  • サイズが変更されたときに強制的splitContainerMain.Panel2.Widthに正しくsplitContainerMainサイズ変更する方法はありますか?
  • あるいは、どうあるPanel2.Widthべきかを計算するにはどうすればよいですか? Form.Resizeまた、イベントからその値を設定するにはどうすればよいですか? (それとも別のイベント?)
4

4 に答える 4

0

私が見たところ、splitcontainer パネルを含む問題を引き起こしているコントロールのアンカーを none に設定する必要があります。

また、分割コンテナーを最大限に活用するために、ドック フィル プロパティを使用することをお勧めします。

さらにヘルプが必要な場合は、デザイナー ファイルを提供してください。

于 2014-11-28T07:15:30.137 に答える
-2

まったく同じ問題、以下のコードが私のために働いた:

  1. パネル「tableBorder」で splitContainer を囲む

テーブル境界上

Dock = DockStyle.Fill;

分割コンテナ上 (固定なし)

Dock = DockStyle.None;
  1. tableBorderSizeChanged イベントで

    private void tableBorder_SizeChanged(object sender, EventArgs e)
    {
        new Thread(() => { resizeMe(); }).Start();
    }
    
    private void resizeMe()
    {
        Thread.Sleep(100);
    
        this.BeginInvoke((Action)(() => {
    
            doIt();
    
        }));
    }
    
    private void doIt()
    {
        splitContainer.Height = tableBorder.Height;
        splitContainer.Width = tableBorder.Width;
    }
    

少しラグがありますが、動作します

于 2015-09-23T17:31:09.387 に答える