2013-03-15 12 views
14

Poiché nella mia applicazione sono presenti più Window s, sto cercando una soluzione che non mi imponga di impostare un binding su ogni Window.Lo stile di Windows da ResourceDictionary non si applica

ho creato un ResourceDictionary che ha una style per lo sfondo della finestra:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="Background" Value="AliceBlue"/> 
</Style> 

Nel mio XAML, ho impostato la ResourceDictionary:

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="Templates.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Window.Resources> 

non ci sono errori, ma i miei Window soggiorni colore bianca.

+0

Si prega di provare Application.Resources invece di Window.Resources – LPL

+0

È il vostro 'ResourceDictionary 'file xaml nella cartella principale del tuo progetto? –

+1

@LPL: dovrebbe funzionare ancora in 'Windows.Resources'. –

risposta

-2

Aggiungi un nuovo pennello nel vostro dizionario risorse

<SolidColorBrush x:Key="WindowBackground" Color="AliceBlue" /> 

e nella finestra WPF è sufficiente impostare la risorsa necessaria per la proprietà della finestra di fondo

<Window x:Class="GDD.Presentation.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="300" Width="300" 
    Background="{StaticResource WindowBackground}"> 
+4

Grazie per la risposta, ma se ho Finestra multipli, ho bisogno di impostare lo sfondo per ciascuna, è per questo che vorrei usare lo stile direttamente! –

+0

Downvoted Per l'impostazione implicita di StaticResource. – lightxx

+5

Se la persona che ha sollevato la domanda ha trovato la risposta adatta e l'ha accettata, non vedo un motivo per cui dovrebbe essere downvoted anche se StaticResource viene impostato implicitamente! Si dovrebbe votare solo se la risposta è completamente irrilevante o errata, non perché qualcuno non abbia usato una buona pratica. –

27

Questo sembra essere causato da una combinazione di l'ordine in cui WPF carica/elabora gli stili da nidificato ResourceDictionary e le specifiche della classe Window.

Si assume che MainWindow sia definito come per il proprio post. Ora mettete quanto segue in Templates.xaml:

<Style TargetType="{x:Type Window}"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 
<Style TargetType="{x:Type Window}" x:Key="myStyle"> 
    <Setter Property="Background" Value="Green"/> 
</Style> 

Se MainWindow non ha stile definito, poi si vedrà che nella finestra di progettazione appare con uno sfondo rosso. Il progettista sta analizzando l'intero Xaml e sta caricando il dizionario delle risorse e quindi disegnando i risultati. Lo stile viene letto prima che la finestra venga disegnata, quindi viene applicato lo sfondo rosso.

Quando si esegue l'applicazione, la finestra viene creata prima dell'applicazione dello ResourceDictionary. Cerca uno stile predefinito (uno stile con x:Key="{x:Type Window}") prima dello l'nidificato ResourceDictionary viene elaborato e non trova nulla. Pertanto in fase di esecuzione, la finestra viene visualizzata con il colore predefinito. (Questo è il comportamento descritto nei commenti sopra.) Ricorda che lo stile con x:Key="{x:Type Window}" ha un valore predefinito che corrisponde allo stile di Windows.

Questo è confermato se si utilizza myStyle in modo esplicito. Se si aggiunge alla definizione Window l'attributo Style="{StaticResource myStyle}", il progettista non riesce, ma si verifica anche un errore in fase di esecuzione, poiché myStyle non è stato creato nel momento in cui la finestra ne ha bisogno. Se passi a Style="{DynamicResource myStyle}" vedrai che funziona come speri, perché DynamicResource verrà aggiornato una volta che lo ResourceDictionary è stato analizzato e lo stile incluso.

Quindi, applicando questo, è possibile risolvere il problema in un modo aggiungendo questo al tuo elemento Window: Style="{DynamicResource {x:Type Window}}" - ma questo è chiaro. La soluzione migliore è quella di includere il dizionario risorse nel file app.xaml, dove sarà analizzato prima di aprire qualsiasi finestra e, quindi, a disposizione di tutti:

<Application.Resources> 
    <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Templates.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

Il vero problema qui è che il Window non è davvero un Window : è una classe che deriva da Window e sarà infatti MainWindow, Window2, ecc ...Ciò significa che il wireup di stile automatico per un non funziona mai con in questo modo e che purtroppo sarà sempre necessario un certo livello di collegamento manuale.

+1

Questa dovrebbe essere la risposta accettata! – lightxx

+0

Grazie mille per questa spiegazione. –

2

Questa è la soluzione che ho usato nella mia applicazione. Mi consente di mantenere tutti gli stili della finestra insieme e richiede solo un paio di righe dopo la sezione <Window.Resources>.

Fate la vostra Style in questo modo:

<Style x:Key="MyWindowStyle"> 
    <Setter Property="Window.Background" Value="AliceBlue"/> 
</Style> 

Poi, nella finestra, dopo </Window.Resources> sono i seguenti:

<Window.Style> 
    <Style BasedOn="{StaticResource MyWindowStyle}"/> 
</Window.Style> 
Problemi correlati