2010-03-26 16 views
6

ho uno stile applicato a tutte le mie caselle di testo, definite in un dizionario risorse ..Non può ignorare uno stile globale WPF che è impostato per TargetType su un singolo controllo specifico

<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>\ 

La grandezza scrittura e le proprietà fontStyle sono associati a una classe di impostazioni utente speciale che implementa iNotifyPropertyChanged, che consente di modificare le dimensioni del font e la famiglia di font per propagandare immediatamente tutta la mia applicazione.

Tuttavia, in un controllo utente che ho creato (ironicamente, lo schermo che consente all'utente di personalizzare le impostazioni dei caratteri), voglio che la dimensione del carattere e la famiglia dei caratteri rimangano statici. Non importa quello che provo, le impostazioni dei caratteri globali sostituiscono quello che ho impostato nel mio controllo utente:

<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> 

... ecc ...

  <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> 

ho provato impostazione Stile a {x: Null}, impostazione delle dimensioni dei caratteri personalizzate in linea e impostazione di uno stile nelle risorse di questo controllo. Nessuno ha la precedenza sugli stili nel mio dizionario delle risorse.

Come potete vedere, mi mostra una spolverata di tutte le cose che ho provato nel campione XAML sopra ...

Che cosa mi manca?

risposta

1

Ok, vedo cosa sta succedendo ora.

Nel costruttore del mio UserControl, ho persino provato a impostare .Style = Nothing, solo per vedere cosa sarebbe successo ... e il mio stile globale era ANCORA arrivato e applicato.

Devo supporre che lo stile globale venga applicato ai miei controlli DOPO che il costruttore gira, e come tale lo stile globale si intromette comunque. Alla fine, ho semplicemente spostato lo stile "globale" in un luogo in cui avrà effetto solo su ciò di cui ho bisogno.

meno conveniente, ma almeno posso andare avanti nel mio progetto

1

Un'altra alternativa è quella di aggiungere uno stile vuoto sul UserControl come ad esempio:

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

che blocca lo stile globale - può anche aggiungerlo alle risorse StackPanel per più fine controllo a grana

  • più exmplanation here