Festlegen eines Window Styles in der App.xaml
So manchen Einsteiger aber auch machen Profis fragen schreiben immer noch diesen Style, wenn auch mit anderen Settern, in die App.xaml.
<Application x:Class="TestApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<Style TargetType="{x:Type Window}"> <Setter Property="Background" Value="LightGray"/>
</Style>
</Application.Resources>
</Application>
Jedoch das gewünschte Ergebnis, nämlich ein Window mit einem Grauen Hintergrund, bleibt aus.
WARUM?
Die Erklärung dieses Problems ist recht einfach und auch Einleuchtend.
Wenn man in einem WPF Projekt ein Fenster erstellen möchte, Implementiert man seinen Content, nicht etwa direkt in ein Window Element, sondern man leitet von dem Steuerelement Window ab und erzeugt somit ein eigenständiges Steuerelement, mit dem Verhalten eines Windows.
Bei den einem normalen Steuerelementen, wie zb einem Button, wird die Button Class ja direkt benutzt, man erwartet ja auch nicht das ein eigenes Conrol, nur weil es vom Button ableitet wurde, auch den Style eines Buttons hat.
mögliche Lösungen:
App.xaml
<Application x:Class="TestApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<SolidColorBrush x:Key="WindowBackground" Color="LightGray"/>
</Application.Resources>
</Application>
Innerhalb des Windows
<Window x:Class="TestApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525" Background="{DynamicResource WindowBackground}">
<Grid/>
</Window>
oder
<Application x:Class="TestApp.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<Style TargetType="{x:Type [WindowType]}"> <setter Property="Background" Value="Black"/>
</Style>
</Application.Resources>
</Application>
Nachteil bei diesen Lösungen:
Der Code muss immer wieder, in jedes Window eingefügt werden.
oder
man Implementiert einmal ein Window mit allem drum und dran, und erstellt nur noch UserControls, die dann dynamisch je nach Zustand in das Stamm Window eingebunden werden.
Auch wenn ich an dieser stelle mögliche Lösungen vorstelle, heißt das natürlich nicht, dass dies die einzigsten Möglichkeiten sind.