2010-03-26 6 views
6

J'ai un style appliqué à tous mes champs de saisie, définis dans un dictionnaire de ressources ..Impossible de remplacer un style global WPF qui est fixé par TargetType sur un seul contrôle spécifique

<Style TargetType="TextBlock"> 
     <Setter Property="TextBlock.FontSize" Value="{Binding Source={StaticResource ApplicationUserSettings}, Path=fontSize, Mode=OneWay}" /> 
     <Setter Property="TextBlock.TextWrapping" Value="Wrap" /> 
     <Setter Property="TextBlock.VerticalAlignment" Value="Center"/> 
     <Setter Property="Background" Value="Transparent"/> 
     <Setter Property="TextBox.FontFamily" Value="{Binding Source={StaticResource ApplicationUserSettings}, Path=fontName, Mode=OneWay}"/> 
    </Style>\ 

Le fontsize et les propriétés fontStyle sont liés à une classe de paramètres utilisateur spéciale qui implémente iNotifyPropertyChanged, ce qui permet de modifier immédiatement la taille de la police et de la fontfamily dans toute l'application.

Cependant, dans un UserControl que j'ai créé (Ironiquement, l'écran qui permet à l'utilisateur de personnaliser ses paramètres de police), je veux que la taille de la police et la fontfamily restent statiques. Peu importe ce que j'essaie, mes paramètres de police globaux l'emportent sur ce que je mets dans mon contrôle utilisateur:

<UserControl x:Class="ctlUserSettings" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:local="clr-namespace:R2D2" Height="400" Width="600"> 

<Grid> 

    <Grid.Resources> 
     <Style x:Key="tbxStyle" TargetType="TextBox"> 
      <Style.Setters> 
       <Setter Property="FontSize" Value="14"/> 
       <Setter Property="FontFamily" Value="Tahoma"/> 
      </Style.Setters> 
     </Style> 

... etc ...

  <StackPanel Margin="139,122.943,41,0" Orientation="Horizontal" Height="33" VerticalAlignment="Top"> 
      <TextBox Style="{x:Null}" FontSize="13" FontFamily="Tahoma" HorizontalAlignment="Left" MaxWidth="500" MinWidth="350" Name="txtReaderPath" Height="Auto" VerticalAlignment="Top" /> 
      <TextBox Style="{x:tbxStyle}" Margin="15,0,0,0" HorizontalAlignment="Left" Name="txtPath" Width="43" Height="23" VerticalAlignment="Top">(some text)</Button> 
     </StackPanel> 

J'ai essayé de placer Style to {x: Null}, définissant les tailles de police personnalisées en ligne et définissant un style dans les ressources de ce contrôle. Aucune n'a priorité sur les styles de mon dictionnaire de ressources.

Comme vous pouvez le voir, je montre un saupoudrage de toutes les choses que j'ai essayé dans l'échantillon XAML ci-dessus ...

Qu'est-ce que je manque?

Répondre

1

Ok, je vois ce qui se passe maintenant.

Dans le constructeur de mon UserControl, j'ai même essayé de définir .Style = Nothing, juste pour voir ce qui se passerait ... et mon style global arrivait encore et s'appliquait.

Je dois supposer que le style global est appliqué à mes contrôles APRES l'exécution du constructeur, et en tant que tel, le style global s'introduit quand même. En fin de compte, j'ai simplement déplacé le style «global» vers un endroit où il ne fera que ce dont j'ai besoin.

moins pratique, mais au moins je peux avancer dans mon projet

1

Une autre alternative est d'ajouter un style vide sur le UserControl tels que:

<UserControl.Resources> 
     <Style TargetType="TextBlock" /> 
</UserControl.Resources> 

qui bloque le style global - peut aussi ajouter aux ressources StackPanel à grain plus fin pour le contrôle

  • plus exmplanation here
Questions connexes