2009-03-13 2 views
31

Desidero utilizzare lo stile della casella di testo Aero, ma comunque sovrascrivo alcune proprietà. Io cerco di ottenere questo risultato:Sovrascrivi lo stile predefinito in WPF TextBox, basato su PresentationFramework.Aero

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <ResourceDictionary.MergedDictionaries> 
     <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml" /> 
    </ResourceDictionary.MergedDictionaries> 

    <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
     <Setter Property="Margin" Value="2" /> 
     <Setter Property="Padding" Value="2" /> 
    </Style> 
</ResourceDictionary> 

Tuttavia, questo si traduce in un StackOverflowException quando si inizia la mia app. Quando rimuovo il riferimento a PresentationFramework.Aero, questo funziona ma ottengo lo stile di default del sistema operativo, che rende l'app brutta. ;)

Quindi, in effetti: se voglio sovrascrivere un certo stile su tutte le mie caselle di testo non riesco a ottenere l'aspetto Aero. Se voglio l'aspetto Aero, non posso ignorare alcuno stile. Deadlock.

Un modo per risolvere questo?

+0

Nel tuo commento Roberts risposta qui sotto ti sembra accennare che avete ottenuto questo lavoro con resourcedictionaries di alto livello. Per favore condividi ciò che ti è venuto in mente. – Oskar

risposta

35

sembra funzionare se si mette il Style come una risorsa di livello inferiore, invece che nella stessa ResourceDictionary:

<Grid xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="/PresentationFramework.Aero, Version=3.0.0.0, Culture=Neutral, PublicKeyToken=31bf3856ad364e35, ProcessorArchitecture=MSIL;component/themes/aero.normalcolor.xaml"/> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Grid.Resources> 
    <Border BorderBrush="Blue" BorderThickness="3"> 
     <Border.Resources> 
      <Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}"> 
       <Setter Property="Margin" Value="2" /> 
       <Setter Property="Padding" Value="2" /> 
      </Style> 
     </Border.Resources> 
     <TextBox /> 
    </Border> 
</Grid> 
+0

Ottimo, funziona. Ho messo gli stili in un altro ResourceDictionary allo stesso livello del dizionario esterno, e StackOverflow è scomparso. Grazie! – Inferis

+5

Grazie per questa risposta, ma è comunque in grado di farlo funzionare sia con il resourcedictionary aerodinamico che con i miei propri stili definiti in Application.Resources (App.xaml)? Non posso davvero permettermi di posizionare questo ad esempio ogni finestra .. – Oskar

12

A differenza del codice in risposta accettato questo permette di utilizzare dizionario risorse per gli stili. Spudoratamente rubato da http://social.msdn.microsoft.com/forums/en-US/wpf/thread/3c66adb7-fd26-40c7-8404-85f6fefbd392/ risposto Vivien Ruitz

<!--App.xaml--> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/MyAppli;component/Resources/Themes/StyleDictionary.xaml"/> 
      <ResourceDictionary Source="/MyAppli;component/Resources/Themes/ApplyStyleDictionary.xaml"/> 
      ... 
     </ResourceDictionary.MergedDictionaries> 

<!--StyleDictionary.xaml--> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
     <Style x:Key="ButtonStyleToApply" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" > 
      ... <!--Extend the aero style here--> 
     </Style> 

<!--ApplyStyleDictionary.xaml--> 
     <Style TargetType="Button" BasedOn="{StaticResource ButtonStyleToApply}"/>