Удалить вкладки из WPF TabControl во время выполнения в C#
Пример
Самый очевидный способ сделать это - добавить новые элементы управления в элементы управления 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 обработчик событий.