2010-02-05 7 views
7

L'impostazione dello stile predefinito su TextBlock fa sì che sia impostato anche lo stile nell'etichetta e in altri controlli. Questo succede solo se metti gli stili nelle risorse dell'applicazione, quando metto lo stile nelle risorse Window tutto va bene.WPF L'impostazione dello stile predefinito su TextBlock ha la precedenza sullo stile di un'etichetta

Ho anche scoperto che VS 2008 Designer e XamlPadX visualizzano l'etichetta come ci si aspetterebbe ma il problema si verifica solo se si esegue l'applicazione nella vita reale.

<Application x:Class="WpfApplication.App" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    StartupUri="Window1.xaml"> 
    <Application.Resources> 
     <ResourceDictionary> 
      <Style TargetType="TextBlock"> 
       <Setter Property="FontSize" Value="8"/> 
      </Style> 

      <Style x:Key="Title" TargetType="Label"> 
       <Setter Property="FontSize" Value="32"/> 
      </Style> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

<Window x:Class="WpfApplication.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Height="300" 
     Title="Window1" 
     Width="300"> 
    <StackPanel> 

     <TextBlock Text="TextBlock No Style" Style="{x:Null}"/> 
     <Label Content="Label No Style" Style="{x:Null}"/> 

     <TextBlock Text="Default TextBlock"/> 
     <Label Content="Default Label" Style="{StaticResource Title}"/> 

    </StackPanel> 
</Window> 

Il codice mostrati: da aspettarsi

TextBlock No Style - Default font size (As you would expect) 
Label No Style - Size 5 font size (How did this happen?) 
Default TextBlock - Size 5 font size (As expected by my style) 
Default Label - Size 5 font size (How did this happen?) 

risposta

10

Sì, è; guarda il modello predefinito per Label, è solo un TextBlock rientrato. Gli stili sono ereditati con, quindi l'etichetta imposterà FontSize su 32, ma lo stile di TextBlock lo sovrascriverà. Se l'avessi appena fatto, sarebbe anche 5pt.

Modifica: Così il modo in cui risolverei questo, è creare una sottoclasse fittizia (cioè una classe che non modifica nulla) di TextBlock chiamata NormalText, quindi stile quello; in questo modo non raccoglierai accidentalmente altri TextBlock.