個々のタブを閉じるためのTabControlのカスタマイズ
-
03-07-2019 - |
質問
私のシナリオは次のとおりです。
クリックするたびに別のタブページを生成するtabcontrolのメインページ内にボタンがあるC#のwinformsアプリケーションで作業しています。新しい各タブページには、ユーザーコントロールによって定義されたレイアウトが含まれます。
私の質問:
-
実行時に動的に作成されたタブの1つをユーザーが閉じられるようにするにはどうすればよいですか?
-
各タブに小さな「X」があり、ユーザーが特定のタブを閉じるためにクリックできるように、tabcontrol自体を変更するにはどうすればよいですか? (Firefoxと同様)
-
代わりにユーザーコントロール内のボタンでタブを閉じたい場合、どうすれば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);
}
}
}
}
次のことを行いました。
作成(追加) 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);