2009-09-23 9 views

Répondre

36
Style s = new Style(); 
s.Setters.Add(new Setter(UIElement.VisibilityProperty, Visibility.Collapsed)); 
tabControl.ItemContainerStyle = s; 
7

Eh bien, il y a plusieurs façons de le faire. La manière la plus laide: Utilisez VisualTreeHelper pour trouver TabPanel (ou tout autre Panel que vous utilisez pour héberger des éléments), et définissez sa propriété Visibility à Visibility.Collapsed. Pourquoi laid? Il est facile de créer quelques bogues ennuyeux ici ou de rompre cette approche avec la mise à jour de style inoffensif si vous n'étiez pas assez prudent ...

Je préfère utiliser la combinaison de Xaml et le code derrière. Vous liez la visibilité de TabItem pour afficher la propriété de modèle ou la visibilité de TabPanel pour afficher la propriété de modèle. Dans les deux cas, vous devez remplacer le style (le style de ItemContainer ou le style entier de TabControl). Dans les deux cas, vous avez un modèle de vue. Maintenant, pour basculer la visibilité de l'en-tête d'onglet, vous venez 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)); 
     } 
    } 
    } 
} 
+6

Wow. Je m'attendais à une ligne telle que tab.Header.Visible = false pas à un code XML gigantesque derrière monster! –

+2

Ceci montre la manière appropriée d'accomplir ceci dans le modèle de conception de MVVM. Bien que ce n'est pas ce que la question a demandé, il est toujours utile pour ceux qui appliquent le modèle dans leur code. – Charlie

+0

utile si vous êtes MVVM stritcly, mais dans certains projets qui utilisent nécessairement des choses générées par une base de données comme un point de vente, ce n'est pas réaliste à appliquer, surtout parce qu'il y a peu de XAML. Cependant, des conseils pour des projets comme celui-ci pour garder le code plus propre? – ThrowingDwarf

63

En fait, il est très simple pour cacher la barre d'onglets. Vous venez de régler chaque TabItem s Visibility sur Collapsed. Vous voyez toujours le contenu de l'onglet, ... juste pas l'en-tête de l'onglet lui-même.

+4

Cela a fonctionné parfaitement pour mon projet. – jlafay

+7

Mine aussi, Savez-vous pourquoi il a ce comportement? Nous nous attendions à ce que le conteneur d'onglets disparaisse complètement. – Purplegoldfish

+0

Cela a fonctionné pour moi aussi - merci. J'ai également fini par créer un BooleanToVisibilityCollapsedConverter afin que je puisse lier cette propriété à mon view-model. –

0

C#

private void TabItemControl_MouseEnter(object sender, MouseEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 100; }} 

private void TabItemControl_MouseLeave(object sender, MouseEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 0; }} 

private void TabAllControl_SelectionChanged(object sender, SelectionChangedEventArgs e) { if (this.TabItemControl.IsSelected == false) { this.TabItemControl.Opacity = 0; }} 
+0

Veuillez expliquer pourquoi c'est la réponse – JonE

0

simple XAML style

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

J'ai essayé cela dans un code où je remplir les éléments de l'onglet manuellement ...

tabItemToAdd.Visibility = Visibility.Collapsed; 

. ..mais alors j'ai eu une chose étrange se produire où la deuxième fois que je effacer l'onglet contrôlez les éléments, créez à nouveau l'élément d'onglet et utilisez cette approche avant de l'ajouter au contrôle de tabulation. L'élément de l'onglet entier et son contenu ont disparu, pas seulement l'en-tête de l'onglet. J'ai donc eu du succès avec l'équivalent programmatique de this solution:

tabItemToAdd.Template = new ControlTemplate();