# Styling in Avalonia The main difference between Avalonia and existing XAML toolkits such as WPF and UWP is in styling. Styling in Avalonia uses a CSS-like system that aims to be more powerful and flexible than existing XAML styling systems. For convenience for the rest of this document we'll refer to existing XAML toolkit's styling as "WPF styling" as that's where it originated. ## Basics - Styles are defined on the `Control.Styles` collection (as opposed to in `ResourceDictionaries` in WPF). - Styles have a `Selector` and a collection of `Setter`s - Selector works like a CSS selector. - Setters function like WPF's setters. - Styles are applied to a control and all its descendants, depending on whether the selector matches. ## Simple example Make all `Button`s in a `StackPanel` have a blue `Background`: ```xaml ``` This is very similar to WPF, except `TargetType` is replaced by `Selector`. _Note that currently (as of Alpha 2) you **always** need to specify the fully qualified property name (i.e. `Button.Background` instead of simply `Background`). This restriction will be lifted in future._ ## Style Classes As in CSS, controls can be given *style classes* which can be used in selectors: ```xaml ``` Each control can be given 0 or more style classes. This is different to WPF where only a single style can be applied to a control: in Avalonia any number of separate styles can be applied to a control. If more than one style affects a particular property, the style closest to the control will take precedence. Style classes can also be manipulated in code using the `Classes` collection: ```csharp control.Classes.Add("blue"); control.Classes.Remove("red"); ``` ## Pseudoclasses Also as in CSS, controls can have pseudoclasses; these are classes that are defined by the control itself rather than by the user. Pseudoclasses start with a `:` character. One example of a pseudoclass is the `:pointerover` pseudoclass (`:hover` in CSS - we may change to that in future). Pseudoclasses provide the functionality of `Triggers` in WPF and `VisualStateManager` in UWP: ```xaml ``` Other pseudoclasses include `:focus`, `:disabled`, `:pressed` for buttons, `:checked` for checkboxes etc. ## Named Controls Named controls can be selected using `#` as in CSS, e.g. `Button#Name`. ## Children As with CSS, you can select children and descendants: - `StackPanel > Button#Foo` selects a `Button` named `"Foo"` that is the child of a `StackPanel`. - `StackPanel Button.foo` selects all `Button`s with the `foo` class that are descendants of a `StackPanel`. ## Templates You can select controls in the template of a lookless control by using the `/template/` selector, so `Button /template/ Border#outline` selects `Border` controls named `"outline"` in the template of a `Button`.