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

I am trying to set the default Style for every window in my WPF Windows application in my app.xaml. So far i have this in app.xaml:

<Application.Resources>
    <ResourceDictionary>
        <Style x:Key="WindowStyle" TargetType="{x:Type Window}">
            <Setter Property="Background" Value="Blue" />
        </Style>
    </ResourceDictionary>
</Application.Resources>

I can get the window to appear with this style when running the app (but not in VS designer) by specifically telling the window to use this style via:

Style="{DynamicResource WindowStyle}

This works, but is not ideal. So how do I:

  1. Have all windows automatically use the style (so i don't have to specify it on every window)?
  2. Have VS designer show the style?

Thanks!


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