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.
Si prega di provare Application.Resources invece di Window.Resources – LPL
È il vostro 'ResourceDictionary 'file xaml nella cartella principale del tuo progetto? –
@LPL: dovrebbe funzionare ancora in 'Windows.Resources'. –