WinUI Styling and Theming

This document covers the fundamental concepts of styling and theming within the Windows UI Library (WinUI). Proper styling ensures your application is visually appealing, consistent with the Windows design language, and accessible to all users.

Understanding Resource Dictionaries

WinUI leverages XAML Resource Dictionaries extensively for defining styles, templates, colors, and other reusable assets. These dictionaries allow for centralized management of your application's visual properties.

Global vs. Local Resource Dictionaries

Resource dictionaries can be defined at various scopes:

Key Styling Concepts

Styles

A Style targets a specific control type and defines its default appearance and behavior. You can define properties like FontSize, Foreground, Background, and even override entire control templates.

Example: Custom Button Style

<Page.Resources>
    <Style TargetType="Button" x:Key="PrimaryButtonStyle">
        <Setter Property="Background" Value="{ThemeResource SystemAccentColor}" />
        <Setter Property="Foreground" Value="White" />
        <Setter Property="Padding" Value="12,6"/>
        <Setter Property="FontSize" Value="14"/>
        <Setter Property="HorizontalAlignment" Value="Left"/>
        <Setter Property="Template">
            <ControlTemplate TargetType="Button">
                <Border Background="{TemplateBinding Background}"
                        BorderBrush="{TemplateBinding BorderBrush}"
                        BorderThickness="{TemplateBinding BorderThickness}"
                        CornerRadius="4"
                        Padding="{TemplateBinding Padding}">
                    <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" />
                </Border>
            </ControlTemplate>
        </Setter>
    </Style>
</Page.Resources>

<Button Style="{StaticResource PrimaryButtonStyle}" Content="Click Me" />

Templates

Control templates define the visual structure of a control. They are composed of XAML elements like Grid, Border, TextBlock, etc., and use binding to connect to the control's properties.

Theme Resources

WinUI provides built-in theme resources that adapt to user preferences (e.g., light/dark mode, high contrast). These are accessed using the ThemeResource markup extension.

Using Theme Resources for Colors

<TextBlock Text="Hello, WinUI!"
               Foreground="{ThemeResource TextColor}"
               FontSize="18" />

<Button Content="Action"
        Background="{ThemeResource SystemAccentColor}"
        Foreground="White" />

Common Theme Resources include:

Applying Styles

Styles can be applied:

Customizing Theme Resources

You can override default theme resources in your App.xaml to globally change colors or other theme-dependent properties.

Overriding a Theme Resource

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <XamlResources xmlns="using:Microsoft.UI.Xaml.Controls" />
            <ResourceDictionary Source="ms-appx:///MyCustomStyles.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <!-- Override a specific theme resource -->
        <SolidColorBrush x:Key="{ThemeResource SystemAccentColor}" Color="Purple" />
    </ResourceDictionary>
</Application.Resources>

Layout Styling

While not strictly "styling" in terms of appearance, layout plays a crucial role. WinUI offers powerful layout panels like Grid, StackPanel, and RelativePanel. Styles can also influence layout properties.

Interactive Elements and Styling

WinUI controls are designed with state-aware styling. For example, buttons have different visual states for Normal, PointerOver, Pressed, and Disabled.

Example: Styling a Toggle Switch

This is a simplified representation of a toggle switch.

Toggle Switch

Best Practices

Demonstrating Input and Button Styling

By mastering WinUI styling, you can create applications that are not only functional but also beautiful and engaging for your users.