Question

J'ai une application WPF (.NET 3.0, VS2008) qui affiche les données dans un contrôle de tabulation. Des couleurs personnalisées sont requises sur pratiquement toutes les commandes de cette application: avant-plan blanc et arrière-plan vert.

Mon problème est que lorsqu'un thème XP (par exemple, Luna) est actif, il est automatiquement appliqué aux contrôles de rendu afin que mon texte blanc soit écrit sur ... un fond blanc. Par exemple, sur l'en-tête d'élément d'onglet actif:

j'ai essayé:

  • pour supprimer le fichier manifeste incorporé de l'application générée (dans les propriétés du projet): inutile.
  • pour forcer l'utilisation du thème Windows Classic dans les ressources de l'application:

    <ResourceDictionary.MergedDictionaries>
      <ResourceDictionary Source="/PresentationFramework.Classic;V3.0.0.0;31bf3856ad364e35;component/themes/classic.xaml" />
    </ResourceDictionary.MergedDictionaries>
    

Cette dernière tentative a très bien fonctionné pour tous les contrôles, à l'exception du contrôle de l'onglet qui reste affiché comme ci-dessus.

Une idée?

Mise à jour : je soupçonne que ce problème est dû au style personnalisé à appliquer au contrôle des onglets:

<Window.Resources>
  <Style x:Key="Custom">
    <Setter Property="Control.Background" Value="#FF47C7C8" />
    <Setter Property="Control.Foreground" Value="White" />
  </Style>
  <Style TargetType="TabControl" BasedOn="{StaticResource Custom}" />
</Window.Resources>

Alors, comment puis-je obtenir le thème classique avec des couleurs personnalisées?

Était-ce utile?

La solution

Pour assurer un comportement cohérent et une apparence cohérente sur tous les systèmes d'exploitation, modifiez le contrôle du contrôle TabItem, puis utilisez un déclencheur pour modifier une partie de votre nouveau modèle lorsqu'un TabItem est sélectionné. Essayez quelque chose comme ce qui suit:

<Grid>
<Grid.Resources>
  <Style x:Key="Custom">
    <Setter Property="Control.Background" Value="#FF47C7C8"/>
    <Setter Property="Control.BorderBrush" Value="#FF47C7C8"/>
    <Setter Property="Control.Foreground" Value="White"/>
  </Style>
  <Style BasedOn="{StaticResource Custom}" TargetType="TabControl"/>
  <Style TargetType="TabItem">
    <Setter Property="Foreground" Value="White"/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type TabItem}">
          <Grid>
            <Border
              Name="Border"
              Background="#FF47C7C8"
              BorderBrush="#FFFFFF"
              BorderThickness="1,1,1,1"
              CornerRadius="2,2,0,0">
              <ContentPresenter
                x:Name="ContentSite"
                HorizontalAlignment="Center"
                Margin="12,2,12,2"
                VerticalAlignment="Center"
                ContentSource="Header"
                RecognizesAccessKey="True"/>
            </Border>
          </Grid>
          <ControlTemplate.Triggers>
            <Trigger Property="IsSelected" Value="True">
              <Setter Property="Panel.ZIndex" Value="100"/>
              <Setter TargetName="Border" Property="Background" Value="#FF47C7C8"/>
              <Setter TargetName="Border" Property="BorderThickness" Value="1,1,1,0"/>
            </Trigger>
          </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
</Grid.Resources>
<TabControl>
  <TabItem Header="Item 1"/>
  <TabItem Header="Item 2"/>
  <TabItem Header="Item 3"/>
  <TabItem Header="Item 4"/>
</TabControl>

Bon chance!

Autres conseils

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top