質問

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

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

私の質問:

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

  2. 各タブに小さな「X」があり、ユーザーが特定のタブを閉じるためにクリックできるように、tabcontrol自体を変更するにはどうすればよいですか? (Firefoxと同様)

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

役に立ちましたか?

解決

約1年前に派生タブコントロールを作成しました。ここではソースを投稿しません。これは約700行の長さで、コードがかなり乱雑だからです。おそらく、コードをクリーンアップして、ここでリリースする時間を見つけるでしょう。今のところ、ビルド方法を簡単に説明します。

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

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

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

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

他のヒント

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

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:マウスの右クリックをキャプチャする方法タブで

次のことを行いました。 作成(追加) 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);

toolstrip tabpage

に追加します
tabControl1.TabPages[curenttabpage].Controls.Add(ts);
ToolStripButton_Click

now は次のとおりです。

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

多分それはあなたが望むほどではないかもしれませんが、うまくいくでしょう。

同様のセットアップを作成しました。

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

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

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

tabControl.TabPages.Remove(parent);

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

            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;
                    }
                }
            }

それは機能します!

TabPage tabpage = (TabPage)this.Parent;
TabControl tabControl = (TabControl)tabpage.Parent;
tabControl.TabPages.Remove(tabpage);
scroll top