【C# WPF TabControl】削除ボタンでタブを削除する

今回は、C# WPF で削除ボタンでタブを削除する方法を説明します。

前回は追加ボタンでタブの複製をしました。その続きとなります。

やりたいこと
  • タブのヘッダーに削除ボタン「×」を追加
  • ボタンを押したときタブを削除

タブ2のヘッダーの「×」を押したとき、

タブ2が削除されるようにします。

開発環境
  • Windows10
  • Microsoft Visual Studio Community2019
  • .NET Framework 4.7.2
  • WPF アプリ( .NET Framework )

作成したコードは↓のリンクから取得できます。

GitHub
GitHub - HomeProgrammer81/TabControlCustom at TabControl_DelButton Contribute to HomeProgrammer81/TabControlCustom development by creating an account on GitHub.
目次

タブのヘッダーにユーザーコントロールを使用する

前回は、タブのコンテンツの部分にユーザーコントロールを使用しました。今回はタブのヘッダーもユーザーコントロールを使用します

ヘッダー用に、ユーザーコントロールを作成しました。xamlは以下の通りです。

<UserControl x:Class="TabAddDelTest.TabHeaderUserControl"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns:local="clr-namespace:TabAddDelTest" mc:Ignorable="d" Height="25" Width="85">
<Grid>
  <Label x:Name="label" Content="Label" HorizontalAlignment="Left" VerticalAlignment="Top" Width="60" Height="25"/>
  <Button Content="×" Margin="60,0,0,0" VerticalAlignment="Top" Height="25" Width="25" Click="ClickedDelete"/>
</Grid>
</UserControl>

ラベルとボタンがあります。このボタンが削除ボタンです。

デザイナで表示すると↑のようになります。これがタブのヘッダー部分になります。

次にユーザーコントロールのソースコードです。

using System.Windows;
using System.Windows.Controls;

namespace TabControlCustom
{
    /// <summary>
    /// TabHeaderUserControl.xaml の相互作用ロジック
    /// </summary>
    public partial class TabHeaderUserControl : UserControl
    {
        public TabHeaderUserControl()
        {
            InitializeComponent();
        }

        public TabHeaderUserControl(int num)
        {
             InitializeComponent();

             label.Content = "タブ" + num;
        }

        private void ClickedDelete(object sender, RoutedEventArgs e)
        {
             TabItem item = (TabItem)this.Parent;
             TabControl tabControl = (TabControl)item.Parent;

             // 1つ前のタブを選択する
             tabControl.SelectedIndex--;

             // タブを削除する
             tabControl.Items.Remove(item);
         }
    }
}

TabHeaderUserControl(int num) コンストラクタは、タブが複製されるときに呼ばれます。タブのヘッダーの文字を設定します。

ClickedDelete メソッドは、削除ボタンを押したときに呼ばれます。ここでは、選択されたタブの削除を行います。

Removeでタブを削除する前に、SelectedIndexで1つ前のタブを選択状態にします。これをしないと、追加ボタンの1つ前のタブを削除しようとしたとき、タブが複製されてしまします

  1. タブを削除した後、追加ボタンのタブが選択状態となる。
  2. MainWindow のSelectedAddDelTab関数( タブの切り替えをした時に呼ばれる関数 ) が呼ばれる。
  3. 追加ボタンを選択したとみなされタブが複製される。

これを防ぐため、あらかじめ1つ前のタブを選択しておかなければいけません。

すなわち、以下のように、タブが1つだけの場合に×ボタンを押すと

タブ1が削除できず自動的に新しいタブができてしまいます。

メインウインドウの処理も変更する

前回は追加ボタンでタブの複製からコードを変更しました。

using System.Windows;
using System.Windows.Controls;

namespace TabControlCustom
{
    /// <summary>
    /// MainWindow.xaml の相互作用ロジック
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            // 先頭のタブの設定
            TabItem item = (TabItem)TabControlAddDel.Items.GetItemAt(0);
            item.Header = new TabHeaderUserControl(1);
            item.Content = new TabItemUserControl(1);
        }

        private void SelectedAddDelTab(object sender, SelectionChangedEventArgs e)
        {
            // 選択したタブのインデックス
            int idx = TabControlAddDel.SelectedIndex;

            // タブの総数
            int count = TabControlAddDel.Items.Count;

            // 追加ボタン(+)を選択する
            if (idx == count - 1)
            {
                // 追加するタブの設定
                TabItem item = new TabItem();
                item.Header = new TabHeaderUserControl(count);
                item.Content = new TabItemUserControl(count);

                // 追加ボタンの前にタブを追加
                TabControlAddDel.Items.Insert(count - 1, item);

                // 追加したタブを選択状態にする
                TabControlAddDel.SelectedIndex = count - 1;
            }
        }
    }
}
変更点
  • タブを複製するとき、先ほど作成した削除ボタンのユーザーコントロールをヘッダーに指定する
  • タブの番号をフィールドに追加する

作成したコードは↓のリンクから取得できます。

まとめ

今回は、C# WPF で削除ボタンでタブを削除する方法を説明しました。

ネットでは見つけられない情報だったので、公開させていただきました。

開発の参考にしていただければと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次