Удалить вкладки из WPF TabControl во время выполнения в C#

Пример Добавить вкладки в WPF TabControl во время выполнения в C# показывает, как вы можете добавлять вкладки в элемент управления во время выполнения. Вы бы подумали, что удаление вкладок было бы проще, и это в некотором роде. Вы просто удаляете объекты TabItem из TabControl.

Самый очевидный способ сделать это - добавить новые элементы управления в элементы управления TabItem. Это означает, что вам также нужно добавить эти элементы управления при создании новой вкладки, поэтому, если вы хотите удалить ее позже.

Код XAML программы включает в себя некоторые стили, чтобы дать вкладкам одинаковый размер и размещать метки внутри них. Следующий код показывает одну из начальных вкладок.


    
        
            
    
    

Элемент TabItem включает в себя обработчик события Image.PreviewMouseDown. Чтобы закрыть вкладку, пользователь нажимает на элемент управления Image (кратко описанный), который находится внутри TabItem. Когда пользователь делает это, событие PreviewMouseDown туннелируется в дерево пользовательского интерфейса и попадает в этот обработчик событий (о чем я расскажу через минуту).

TabItem.Header содержит Grid, который содержит Label и Изображение. Label просто отображает текст заголовка вкладки. Изображение отображает X, который пользователь может щелкнуть, чтобы закрыть вкладку.

Содержимое элемента TabItem содержит только Label. Обычно вы, вероятно, кладете здесь контейнер, например сетку, а затем размещаете другие элементы управления внутри контейнера.

В следующем коде показан обработчик события Image.PreviewMouseDown.

// Удалите вкладку кликов.
private void TabItem_RemoveClicked(object sender,
    MouseButtonEventArgs e)
{
    // Найдите нажатую вкладку.
    TabItem tab_item = sender as TabItem;

    // Удаление TabItem.
    tabMain.Items.Remove(tab_item);

    e.Handled = true;
}

Этот обработчик событий вызывается объектом TabItem, который его зарегистрировал. Код преобразует параметр sender (который является TabItem, который поднял событие) в TabItem, а затем удаляет его из TabControl .

Код заканчивается установкой e.Handled на true, чтобы событие больше не перемещалось через дерево пользовательского интерфейса.

Это поможет удалить вкладку. Теперь нам нужно изменить способ добавления предыдущего примера вкладки .

Следующий код выполняется, когда вы нажимаете кнопку «+» программы.

// Добавить вкладку в TabControl.
private void btnAdd_Click(object sender, RoutedEventArgs e)
{
    TabItem tab_item = new TabItem();
    tab_item.AddHandler(
        Image.PreviewMouseDownEvent,
        new RoutedEventHandler(PreviewMouseDown_Handler));
    tabMain.Items.Add(tab_item);

    Grid grid = new Grid();
    grid.Width = 70;
    grid.Height = 30;

    Label label = new Label();
    label.Content = "New Tab";
    label.HorizontalAlignment = HorizontalAlignment.Left;
    label.VerticalAlignment = VerticalAlignment.Center;
    grid.Children.Add(label);

    Image image = new Image();
    
    image.HorizontalAlignment = HorizontalAlignment.Right;
    image.VerticalAlignment = VerticalAlignment.Top;
    image.Source = new BitmapImage(new Uri(
        "pack:// Применение: ,,, / howto_wpf_remove_tabs; компонент / Remove.png"));
    image.Stretch = Stretch.None;
    image.Cursor = Cursors.Cross;
    image.Width = 10;
    image.Height = 10;
    grid.Children.Add(image);

    tab_item.Header = grid;

    Label content = new Label();
    content.Content = "This is the new tab's content";
    tab_item.Content = content;
}

Этот код в основном просто создает элементы управления, необходимые для сборки вкладки, ее заголовка и его содержимого. Самая интересная часть - это то, где код дает новый TabItem новый обработчик событий, чтобы поймать присоединенное событие Image.PreviewMouseDownEvent. Код использует метод AddHandler элемента, чтобы добавить новый RoutedEventHandler. К сожалению, подпись для этого типа обработчика событий точно не соответствует сигнатуре ранее созданного обработчика событий. Второй параметр обработчика маршрутизируемого события имеет тип RoutedEventArgs, а второй параметр предыдущего обработчика имеет более специфический тип MouseButtonEventArgs.

Вы можете изменить предыдущий обработчик событий, чтобы он занимал менее конкретный тип. Вместо этого я просто создал новый обработчик событий, чтобы поймать новый тип события.

// Параметр e фактически является MouseButtonEventArgs.
private void PreviewMouseDown_Handler(object sender,
    RoutedEventArgs e)
{
    TabItem_RemoveClicked(sender, e as MouseButtonEventArgs);
}

Этот код просто преобразует второй параметр в более конкретный тип и затем вызывает ранее определенный TabItem_RemoveClicked обработчик событий.

Источник: http://csharphelper.com/blog/2016/04/remove-tabs-wpf-tabcontrol-runtime-c/

1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Adblock
detector