8

WinFormsデスクトップ アプリケーションでMicrosoft のSplitContainerコントロールを使用しています。

スプリッター コントロールのパネル間に小さなボタン (または素敵な UI 要素) を配置して、パネルの 1 つを折りたたみたいと思います。たとえば、2 つの部分を持つ「ボタン」の場合、一方の部分をクリックすると右側のパネルが折りたたまれ、もう一方の部分をクリックすると左側のパネルが折りたたまれます。

これは可能ですか?それはどのように実装できますか?

4

3 に答える 3

8

そのためには、独自のイベントを作成する必要があります。デザインを決める必要があります。以下のようなものが必要になることを願っています。

private void radButton1_Click(object sender, EventArgs e) 
{ 
    splitPanel1.Collapsed = !splitPanel1.Collapsed; 
}

編集1

あなたが思うように簡単な方法はありません。ここここを見て、アイデアを得てください。

編集2

Dock:Top である両方のパネルに 2 つの toolStrips を追加し、下の画像のように 2 つのボタンを追加すると、見栄えがよくなります。ちょっとした考え...

ここに画像の説明を入力

編集3

スプリッターは別のオプションです。こちらをご覧ください。

于 2011-06-17T00:17:45.670 に答える
3

私は実装でこのソリューションを使用しました。おそらくあなたには遅すぎますが、他の人には役立つかもしれません。

私の実装では、コントロールをあるパネルから別のパネルに移動しました。そのため、最後のアクションとしてパネルの折りたたみ状態のみを変更しています。

画像が載せられないので、以下の図に従って考えてみてください([<]と[>]はボタンです):

 ╔════════════╤═════════════╗
 ║         [<]│[>]          ║ 
 ║            │             ║ 
 ║            │             ║ 
 ║            │             ║ 
 ║            │             ║ 
 ║            │             ║ 
 ╚════════════╧═════════════╝

以下は、左側のパネル (panel1) の実装です。右側のパネルにも同様の関数が使用されています。

    private void setSplitterLeftPanelCollapsedState(bool collapse)
    {
        splitContainer1.SuspendLayout();

        // Collapse the left panel
        if (collapse)
        {
            if (!splitContainer1.Panel1Collapsed)
            {
                // restoring the panel in the end to apply layout changes
                buttonOpenPanel1.Text = ">";
                splitContainer1.Panel1Collapsed = true;
            }
        }
        // Open the left panel
        else
        {
            if (splitContainer1.Panel1Collapsed)
            {
                // collapsing the panel in the end to apply layout changes
                buttonOpenPanel1.Text = "<";
                splitContainer1.Panel1Collapsed = false;
            }
        }

        splitContainer1.ResumeLayout();

        comboBoxSearchText.Focus();
    }
于 2012-01-24T15:55:03.207 に答える
2

Lotus Notes のレイアウトに着想を得て、この状況で役立つと思われるものを設計しました。パネル間には 1 つのパネルの展開/折りたたみ状態を切り替えるボタンが 1 つしか含まれていませんが、2 つのボタンを使用して左右のパネルを制御するように簡単に変更できます。2 つの分割コンテナーを使用し、1 つを別のコンテナー内にドッキングし、「中央」パネルの mouseMove イベントを使用して、スプリッターのドラッグをシミュレートします (C# では、マウスでドラッグしてコントロールを移動します)。さらに、コンテナーの ClientSizedChanged イベントを使用して、パネルを折りたたむ/展開するメソッドの代わりに、ボタン イメージを切り替えるロジックを処理します ( SplitContainer が折りたたまれた変更を検出する)。

デザイン:

splitContainer1
╔════════════╤═════════════════════════════════╗
║            │ splitContainer2 (docked fill)   ║
║            │ ╔════════════╤════════════════╗ ║
║            │ ║            │                ║ ║
║            │ ║ Button(s)  │                ║ ║
║            │ ║ [<>]       │                ║ ║
║            │ ║            │                ║ ║
║            │ ╚════════════╧════════════════╝ ║
╚════════════╧═════════════════════════════════╝

splitContainer2.Dock = DockStyle.Fill;
splitContainer1 = splitContainer2.IsSplitterFixed = true;
splitContainer2.Panel1.Cursor = Cursors.VSplit;

左または右のアンカー ボタン (または tableLayout コントロール内に複数のボタンをドッキング)。クリック/ドラッグできるパネルの一部がまだ残っていることを確認してください。
中央パネルの最大値を低い数値に設定します。サイズは、必要なボタンの幅によって異なります。

コード:

パネルは反対の状態に切り替わり
ます 2 つのボタンやトグル ボタンの代わりに 2 つの部分を持つ 1 つのボタンが本当に必要な場合は、クリックされたマウス座標を取得し、クリックが発生した場所に応じて異なるロジックを使用する必要があります。

private void btnExpand_Click(object sender, EventArgs e)
{
    splitContainer1.Panel1Collapsed = !splitContainer1.Panel1Collapsed;  
}

展開/折りたたみに関連付けられたハンドル ロジック。このイベントを使用することにしたのは、ユーザーがパネルを折りたたんだり展開したりできる方法がプログラムにいくつかあるためです。

    private void splitContainer1_Panel2_ClientSizeChanged(object sender, EventArgs e)
    {

        if (splitContainer1.Panel1Collapsed)
        {
            splitContainer2.Panel1.Cursor = Cursors.Default;
            this.btnExpand.Image =  imageExpand;
        }
        Else
       {
            splitContainer2.Panel1.Cursor = Cursors.VSplit;
            this.btnExpand.Image = imageCollapse;
      }
    }

フェイクスプリッターの移動によるパネルのサイズ変更を処理します

    private void splitContainer2_Panel1_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Left)
        {

    /* All you really need is this:
                splitContainer1.SplitterDistance += e.X;  

    Note: Splitter distance must be a positive integer and e.X will be negitive when dragging to the left of the splitContainer. You could handel this check here or on the splitterMoving event.

        The code I have below shows how to “snap” a panel closed if the splitter is moved close enough to the edge 
    Or prevent a panel from being hidden from view (which could also be accomplished by setting the minimum size of a panel). 

    */

            if (e.X + splitContainer1.SplitterDistance < 40)
            {

               while (splitContainer1.SplitterDistance > 1)
                    splitContainer1.SplitterDistance--;
                splitContainer1.Panel1Collapsed = true;

            }
            else if ((e.X + splitContainer1.SplitterDistance) * 1.00 / this.Width * 1.00 < .75)
                splitContainer1.SplitterDistance += e.X;  
            else
                Cursor.Current = Cursors.No;


        }
}
于 2013-10-24T17:50:31.213 に答える