2009-09-23 16 views

Respuesta

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

Bueno, hay varias formas de hacerlo.

La manera más fea: utilice VisualTreeHelper para encontrar TabPanel (o cualquier otro panel que utilice para alojar elementos) y establezca su propiedad de visibilidad en Visibility.Collapsed. ¿Por qué feo? Es fácil crear algunos errores molestos aquí o romper este enfoque con la actualización de estilo "inofensivo" si no fue lo suficientemente cuidadoso ...

Prefiero usar la combinación de Xaml y el código detrás. Vincula la visibilidad de TabItem para ver la propiedad del modelo o la visibilidad de TabPanel para ver la propiedad del modelo. En ambos casos, debe anular el estilo (ya sea el estilo de ItemContainer o el estilo de TabControl completo). En ambos casos, tiene el modelo de vista. Ahora, para alternar la visibilidad del encabezado de tabulación, solo actualiza una propiedad en el modelo de vista. He aquí un ejemplo con 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. ¡Esperaba una línea como 'tab.Header.Visible = false' no a un gigantesco código XML + detrás de monstruo! –

+2

Esto muestra la forma apropiada de lograr esto dentro del patrón de diseño de MVVM. Si bien esto no es lo que la pregunta solicitó, sigue siendo útil para quienes aplican el patrón en todo su código. – Charlie

+0

es útil si usted es estrictamente MVVM, pero en algunos proyectos que necesariamente usan elementos generados por la base de datos como un POS, esto no es realista de aplicar, especialmente porque hay poco o ningún XAML. Sin embargo, ¿hay algún consejo para proyectos como ese para mantener el código más limpio? – ThrowingDwarf

63

En realidad, es muy sencillo para ocultar la barra de pestañas. Usted acaba de configurar cada TabItem s Visibility a Collapsed. Todavía ve el contenido de la pestaña, ... simplemente no el encabezado de la pestaña en sí.

+4

Esto funcionó perfectamente para mi proyecto. – jlafay

+7

Mía también, ¿sabes por qué tiene este comportamiento? Esperábamos que el contenedor de pestañas desapareciera por completo. – Purplegoldfish

+0

Esto funcionó para mí también, gracias. También terminé creando un BooleanToVisibilityCollapsedConverter para poder enlazar datos de esta propiedad a mi 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

Proporcione algunos antecedentes sobre por qué esta es la respuesta – JonE

0

simple XAML Estilo

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

He intentado esto en algún código en el que pueblan los elementos de la ficha manualmente ...

tabItemToAdd.Visibility = Visibility.Collapsed; 

. ... pero luego tuve una cosa extraña que sucedió donde la segunda vez borré la pestaña controle los elementos, cree el elemento de la pestaña de nuevo y utilice este enfoque antes de agregarlo al control de pestañas, el elemento de la pestaña completa y sus contenidos se han ido, no solo el encabezado de la pestaña. Así que he tenido éxito con el equivalente programático de this solution:

tabItemToAdd.Template = new ControlTemplate(); 
Cuestiones relacionadas