How to set default WPF Window Style in app.xaml? How to set default WPF Window Style in app.xaml? wpf wpf

How to set default WPF Window Style in app.xaml?


To add on to what Ray says:

For the Styles, you either need to supply a Key/ID or specify a TargetType.

If a FrameworkElement does not have an explicitly specified Style, it will always look for a Style resource, using its own type as the key
- Programming WPF (Sells, Griffith)

If you supply a TargetType, all instances of that type will have the style applied. However derived types will not... it seems. <Style TargetType="{x:Type Window}"> will not work for all your custom derivations/windows. <Style TargetType="{x:Type local:MyWindow}"> will apply to only MyWindow. So the options are

  • Use a Keyed Style that you specify as the Style property of every window you want to apply the style. The designer will show the styled window.

.

    <Application.Resources>        <Style x:Key="MyWindowStyle">            <Setter Property="Control.Background" Value="PaleGreen"/>            <Setter Property="Window.Title" Value="Styled Window"/>        </Style>    </Application.Resources> ...    <Window x:Class="MyNS.MyWindow" Style="{StaticResource MyWindowStyleKey}">  ...
  • Or you could derive from a custom BaseWindow class (which has its own quirks), where you set the Style property during the Ctor/Initialization/Load stage once. All Derivations would then automatically have the style applied. But the designer won't take notice of your style You need to run your app to see the style being applied.. I'm guessing the designer just runs InitializeComponent (which is auto/designer generated code) so XAML is applied but not custom code-behind.

So I'd say explicitly specified styles are the least work. You can anyways change aspects of the Style centrally.


Know this is years later, but since the question is still up here...

  1. Create a resource dictionary in your project (Right-click the project...)

    I'll create a new folder under the Project called "Assets" and put "resourceDict.XAML in it.

  2. Add the code to resourceDict.XAML:

    <Style x:Key="WindowStyle" Target Type="Window" >     <Setter Property="Background" Value="Blue" /></Style>
  3. In your Project XAML file add the following under Window:

    <Window.Resources>    <ResourceDictionary>        <!-- Believe it or not the next line fixes a bug MS acknowledges -->        <Style TargetType="{x:Type Rectangle}" />        <ResourceDictionary.MergedDictionaries>            <ResourceDictionary Source="/Assets/resourceDict.XAML" />        </ResourceDictionary.MergedDictionaries>    <ResourceDictionary></Window.Resources>

    ref the following web site: Trouble referencing a Resource Dictionary that contains a Merged Dictionary"There is a bug: if all your default styles are nested in merged dictionaries three levels deep (or deeper) the top dictionary does not get flagged so the search skips it. The work around is to put a default Style to something, anything, in the root Dictionary."And it seems to fix things reliably. Go figure...

  4. And finally, under Window, maybe after Title, but before the final Window '>' :

    Style="{DynamicResource windowStyle}"
  5. And you'll need to add the code in steps 3 & 4 to every project to which you want the style to apply.

  6. If you wanted to use a gradient background rather than a solid color, add the following code to the resourceDict.XAML:

    <LinearGradientBrush x:Key="windowGradientBackground" StartPoint="0,0"        EndPoint="0,1" ><GradientStop Color= "AliceBlue" Offset="0" /><GradientStop Color= "Blue" Offset=".75" /></LinearGradientBrush>
  7. And modify your Style Setter for the background color to read:

    <Setter Property="Background" Value="{DynamicResource        windowGradientBackground}" />

Steps 3 & 4 need to be repeated in each project.XAML file as described above, but hey, you get uniform Windows across the Solution! And the same process could apply to any controls you want to have a uniform look as well, buttons, whatever.

For anyone coming into this late, hope this helps as I'm sure the original posters got this all figured out years ago.

Paul


The designer is not working because you're specifying a DynamicResource. Please change this to StaticResource and all will be well.

To apply to all windows, you should remove the x:Key from the style. Setting the TargetType implicitly sets the x:Key to whatever is in TargetType. However, in my tests, this is not working, so I am looking into it.

If I set the TargetType to x:Type TextBlock, the designer works perfectly, it just seems to be the Window that is showing different behaviour.