web-dev-qa-db-fra.com

Masquer l'en-tête TabControl

Quelle est la méthode de programmation (c'est-à-dire ne pas utiliser les styles comme dans cette question , mais utiliser du code) pour masquer l'en-tête TabControl? Je serai heureux pour un extrait.

29
Elazar Leibovich
Style s = new Style();
s.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed));
tabControl.ItemContainerStyle = s;
39
Thomas Levesque

En fait, c’est très simple de cacher la bande de tabulation. Vous venez de définir chaque TabItems Visibility à Collapsed. Vous voyez toujours le contenu de l'onglet, ... mais pas l'en-tête de l'onglet lui-même.

71
Stimul8d

Eh bien, il y a plusieurs façons de le faire. 

La méthode la plus laide: utilisez VisualTreeHelper pour rechercher TabPanel (ou tout autre panneau utilisé pour héberger des éléments) et définissez sa propriété Visibility sur Visibility.Collapsed. Pourquoi moche? Il est facile de créer ici quelques bugs ennuyeux ou de casser cette approche avec une mise à jour de style «inoffensive» si vous n'avez pas été assez prudent ...

Je préfère utiliser la combinaison de Xaml et de code derrière. Vous liez la visibilité de TabItem pour afficher la propriété du modèle ou la visibilité de TabPanel pour afficher la propriété du modèle. Dans les deux cas, vous devez redéfinir le style (style ItemContainer ou style TabControl complet). Dans les deux cas, vous avez le modèle de vue. Maintenant, pour basculer la visibilité de l'en-tête de l'onglet, il vous suffit de mettre à jour une propriété dans le modèle de vue. Voici un exemple avec TabItems:

XAML

<Window x:Class="WpfApplication5.Window1"
        xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication5"
        Title="Tab Settings"
        Height="300"
        Width="300">
  <Window.Resources>
    <local:TabControlViewModel x:Key="tabVM" />
    <BooleanToVisibilityConverter x:Key="booleanToVisibilityConverter" />
  </Window.Resources>
  <Grid>
    <TabControl DataContext="{StaticResource tabVM}">
      <TabControl.ItemContainerStyle>
        <Style TargetType="{x:Type TabItem}">
          <Setter Property="Visibility"
                  Value="{Binding TabHeaderVisible, Converter={StaticResource booleanToVisibilityConverter}}" />
        </Style>
      </TabControl.ItemContainerStyle>
      <TabItem Header="Tab 1">
        <StackPanel>
          <TextBlock Text="Content" />
          <Button Content="Toggle Header"
                  Click="ToggleHeaderClick" />
        </StackPanel>
      </TabItem>
      <TabItem Header="Tab 2 Header">
        <TextBlock Text="Tab 2 Content" />
      </TabItem>
    </TabControl>
  </Grid>
</Window>

C #

using System.ComponentModel;
using System.Windows;
using System.Windows.Input;

namespace WpfApplication5
{
  public partial class Window1 : Window
  {
    public Window1()
    {
      InitializeComponent();
    }

    private void ToggleHeaderClick(object sender, RoutedEventArgs e)
    {
      var tabControlVM =
        ((FrameworkElement)sender).DataContext as TabControlViewModel;
      if (tabControlVM != null)
      {
        tabControlVM.TabHeaderVisible = !tabControlVM.TabHeaderVisible;
      }
    }
  }

  public class TabControlViewModel : INotifyPropertyChanged
  {
    private bool _tabHeaderVisible = true;

    public ICommand ToggleHeader
    {
      get; private set;
    }

    public bool TabHeaderVisible
    {
      get { return _tabHeaderVisible; }
      set
      {
        _tabHeaderVisible = value;
        OnPropertyChanged("TabHeaderVisible");
      }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string name)
    {
      var changed = PropertyChanged;
      if (changed != null)
      {
        changed(this, new PropertyChangedEventArgs(name));
      }
    }
  }
}
7
Anvaka

Style XAML simple

<TabControl>
    <TabControl.ItemContainerStyle>
        <Style TargetType="{x:Type TabItem}">
            <Setter Property="Visibility" Value="Collapsed"/>
        </Style>
    </TabControl.ItemContainerStyle>
    ...
</TabControl>
5
Sebastian

J'ai essayé ceci dans du code où je remplis les éléments d'onglets manuellement ...

tabItemToAdd.Visibility = Visibility.Collapsed;

... mais ensuite, une chose étrange s'est produite: la deuxième fois, j'ai effacé les éléments du contrôle d'onglets, créé à nouveau l'élément d'onglets et utilisé cette approche avant de l'ajouter au contrôle d'onglet. disparu, pas seulement l'en-tête de l'onglet. J'ai donc eu du succès avec l'équivalent programmatique de cette solution :

tabItemToAdd.Template = new ControlTemplate();
0
Eric Eggers