web-dev-qa-db-ja.com

個々のタブを閉じるためのTabControlのカスタマイズ

私のシナリオは次のとおりです:

タブコントロールのメインページ内に、クリックするたびに別のタブページを生成するボタンがあるC#のwinformsアプリケーションに取り組んでいます。新しい各タブページには、ユーザーコントロールによって定義されたレイアウトが含まれます。

私の質問は:

  1. 実行時に動的に作成されたタブの1つをユーザーが閉じられるようにするにはどうすればよいですか?

  2. ユーザーが特定のタブを閉じるためにクリックできる各タブに小さな「X」が含まれるように、タブコントロール自体を変更するにはどうすればよいですか? (Firefoxのように)

  3. 代わりにユーザーコントロール内のボタンでタブを閉じたい場合、ユーザーコントロールにtabcontrolのSelectedIndexプロパティを公開するにはどうすればよいですか?

18
THE DOCTOR

約1年前に派生タブコントロールを作成しました。ここにはソースを投稿しません。これは、約700行の長さであり、コードがかなり乱雑にコーディングされているためです。たぶん、コードをクリーンアップして、ここでリリースする時間が見つかるかもしれません。とりあえず、ビルド方法の概要を簡単に説明します。

各タブページには、タイトルのleftに「X」アイコンがあり、タブページは、ドラッグアンドドロップによる並べ替え、および複数のタブコントロール間での移動をサポートしています。

タブページにアイコンを表示する簡単な方法を選択します。タブコントロールには _TabControl.ImageList_ プロパティがあり、タブページには _TabPage.ImageIndex_ プロパティがあります。そのため、画像リストに3つのアイコン(通常、ホバー、押す)を追加し、マウスイベントを処理しました。

TabControl.GetTabRect() を使用すると、マウスが特定のタブページ上にあるかどうかをテストできます。また、数学を使用すると、アイコンの上にあるかどうかを確認できます。次に、マウスボタンの状態に応じてアイコンを変更し、ボタンが押された場合は最終的にマウスの下のタブページを削除する必要があります。

このソリューションの主な問題は、マウスがアイコンの上にあるかどうかを計算するには、アイコンがタブページに対してどこに描画されるかを知る必要があり、これは新しいウィンドウズバージョンで変わる可能性があることです。アイコンはタイトルの左側にありますが、見た目は悪くありません。

9

私はこのコードを見つけて、とても役に立ちました:

private void tabControl_MouseUp(object sender, MouseEventArgs e)
{
    // check if the right mouse button was pressed
    if(e.Button == MouseButtons.Right)
    {
        // iterate through all the tab pages
        for(int i = 0; i < tabControl1.TabCount; i++)
        {
            // get their rectangle area and check if it contains the mouse cursor
            Rectangle r = tabControl1.GetTabRect(i);
            if (r.Contains(e.Location))
            {
                // show the context menu here
                System.Diagnostics.Debug.WriteLine("TabPressed: " + i);
             }
        }
    }
}

TabControl:タブでマウスの右クリックをキャプチャする方法

14
Vallel

私は次のことを行いました:作成(追加)TabPageステージで、toolStripを追加しました

ToolStrip ts = new ToolStrip();
ts.Dock = DockStyle.Top;
ts.RightToLeft = System.Windows.Forms.RightToLeft.Yes;

次に、Xボタンを作成してtoolstripに追加します

ToolStripButton ToolStripButton = new ToolStripButton("X");
ts.Items.Add(ToolStripButton);

Xボタンをクリックしたときにイベントを作成する

ToolStripButton.Click += new EventHandler(ToolStripButton_Click);

toolstriptabpageに追加

tabControl1.TabPages[curenttabpage].Controls.Add(ts);

ToolStripButton_Click 以下のとおりであります:

void ToolStripButton_Click(object sender, EventArgs e)
{ 
 ToolStripButton t = (ToolStripButton)(sender);
 ToolStrip ts = t.Owner;
 TabPage tb = (TabPage)
 (ts.Parent);tabControl1.TabPages.Remove(tb);
}

多分それはあなたが望むものではないかもしれませんが、それはうまくいきます。

6
Muhammad Hamad

同様の設定を作成しました。

実行時にタブページに追加される各コントロールは、私が作成した特別な基本コントロールから派生します。この基本コントロールには、閉じるボタンがあります(フラグを安全に閉じるなど、他のいくつかの機能と共に)。

ベースコントロールで使用しているタブコードを閉じる:

 TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;

tabControl.TabPages.Remove(parent);
2
Crispy

私はこれが古いスレッドであることを知っていますが、これを見つけました link これにより、配列内のタブを「非表示」にして、実行時に必要なタブを再ロードすることができます。簡単に見つけられる場所にこれを追加しました。

1
Mark Kram

このコードは、マウスの中央クリックでタブコントロールを閉じるのに役立ちます。

            private void tabControl1_MouseDown(object sender, MouseEventArgs e)
            {
                if (e.Button != System.Windows.Forms.MouseButtons.Middle)
                    return;

                for (int i = 0; i < MainTabControl.TabPages.Count; i++)
                {
                    if (this.MainTabControl.GetTabRect(i).Contains(e.Location))
                    {
                        this.MainTabControl.TabPages.RemoveAt(i);
                        return;
                    }
                }
            }
0