VisualStateGroup Class
Definition
Important
Some information relates to prerelease product that may be substantially modified before it’s released. Microsoft makes no warranties, express or implied, with respect to the information provided here.
Contains mutually exclusive VisualState objects and VisualTransition objects that are used to go from one state to another.
public ref class VisualStateGroup sealed : DependencyObject
/// [Microsoft.UI.Xaml.Markup.ContentProperty(Name="States")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
/// [Windows.Foundation.Metadata.ContractVersion(Microsoft.UI.Xaml.WinUIContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
class VisualStateGroup final : DependencyObject
[Microsoft.UI.Xaml.Markup.ContentProperty(Name="States")]
[Windows.Foundation.Metadata.Activatable(65536, "Microsoft.UI.Xaml.WinUIContract")]
[Windows.Foundation.Metadata.ContractVersion(typeof(Microsoft.UI.Xaml.WinUIContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
public sealed class VisualStateGroup : DependencyObject
Public NotInheritable Class VisualStateGroup
Inherits DependencyObject
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="groupname" ...>
oneOrMoreVisualStates
</VisualStateGroup>
<!--- other peer VisualStateGroup's here ... -->
</VisualStateManager.VisualStateGroups>
- Inheritance
- Attributes
Examples
This example creates a simple ControlTemplate for a Button that contains one Grid. It also contains a VisualStateGroup
called "CommonStates", which defines the "PointerOver" and "Normal" states. The VisualStateGroup
also has a VisualTransition that specifies that it takes one half second for the Grid
to change from green to red when the user puts the pointer over the Button
.
<ControlTemplate TargetType="Button">
<Grid >
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<!--Take one half second to transition to the PointerOver state.-->
<VisualTransition To="PointerOver"
GeneratedDuration="0:0:0.5"/>
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<!--Change the SolidColorBrush, ButtonBrush, to red when the
Pointer is over the button.-->
<VisualState x:Name="PointerOver">
<Storyboard>
<ColorAnimation Storyboard.TargetName="ButtonBrush"
Storyboard.TargetProperty="Color" To="Red" />
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<Grid.Background>
<SolidColorBrush x:Name="ButtonBrush" Color="Green"/>
</Grid.Background>
</Grid>
</ControlTemplate>
Remarks
Each VisualStateGroup
declared in XAML as part of a control template should always have an x:Name attribute set on it. Each name string used in the set of VisualStateGroups
in a control template must be unique in that template. It's common to use the same group names for different controls though. For example, almost all existing control templates have a VisualStateGroup
with x:Name attribute
of "CommonStates".
The set of visual states within each VisualStateGroup
should be mutually exclusive in the group. In other words, the control should be using exactly one of the visual states from each of its defined VisualStateGroup
groups at all times. Whenever there's a case where a control is intended to be simultaneously in two states, make sure that the two states are in different groups. For example, it's possible for a drop-down control to simultaneously be focused and have its drop-down open. In a correct visual state design, you'd have a separate VisualStateGroup
for each state so they can both be active at once. Such groups might have names like "FocusStates" and "DropDownStates".
Whenever you define a VisualStateGroup
that enables a temporary storyboarded behavior in one of its VisualState elements, make sure that group also contains a second VisualState
that can be called to cancel the previous state. This can be as simple as declaring the second VisualState
with no Storyboard at all, just an x:Name attribute.
The x:Name attribute value you set for a VisualStateGroup
is not used for a call to VisualStateManager.GoToState; instead it's the x:Name attribute
of a VisualState that is used for VisualStateManager.GoToState
. Anyone that uses VisualStateManager.GoToState
should be aware of all the groups and states available, so that each call correctly transitions from old states to new states within a group.
In addition to a set of VisualState elements, a VisualStateGroup
can also define a set of VisualTransition elements, where each VisualTransition
pertains to at least one of the named VisualState
elements defined in the group. In XAML, the set of VisualState
elements can be declared as immediate object element child elements of the VisualStateGroup
. This is possible because the States property, which is the collection of visual states, is the XAML content property for VisualStateGroup
. In contrast, to set the collection of visual transitions, you must declare that collection within a VisualStateGroup.Transitions property element in XAML. For more info on XAML content properties, see XAML syntax guide.
When using StateTriggers to control visual states, the trigger engine uses the following precedence rules to score triggers and determine which trigger, and the corresponding VisualState, will be active:
- Custom trigger that derives from StateTriggerBase
- AdaptiveTrigger activated due to MinWindowWidth
- AdaptiveTrigger activated due to MinWindowHeight
If there are multiple active triggers at a time that have a conflict in scoring (i.e. two active custom triggers), then the first one declared in the markup file takes precedence.
Note: While AdaptiveTrigger does derive from StateTriggerBase, it can only be activated through setting MinWindowWidth and/or MinWindowHeight.
VisualStateGroup API that support custom VisualStateManager implementation
Many of the API of VisualStateGroup
exist only to support custom VisualStateManager implementation. These include: Name, CurrentState, CurrentStateChanging, CurrentStateChanged. Most common usages of visual states for control templates won't need these API. In particular it's not typical to handle the events. Most logic operations for a control should involve its own properties and events. For most app and control definition scenarios, visual state changes that happen to the control should only be an end result of logic that the control applies to its template, not a trigger for other logic.
Constructors
VisualStateGroup() |
Initializes a new instance of the VisualStateGroup class. |
Properties
CurrentState |
Gets the most recently set VisualState from a successful call to the GoToState method. |
Dispatcher |
Always returns |
DispatcherQueue |
Gets the |
Name |
Gets the name of the VisualStateGroup. |
States |
Gets the collection of mutually exclusive VisualState objects. |
Transitions |
Gets the collection of VisualTransition objects. |
Methods
ClearValue(DependencyProperty) |
Clears the local value of a dependency property. (Inherited from DependencyObject) |
GetAnimationBaseValue(DependencyProperty) |
Returns any base value established for a dependency property, which would apply in cases where an animation is not active. (Inherited from DependencyObject) |
GetValue(DependencyProperty) |
Returns the current effective value of a dependency property from a DependencyObject. (Inherited from DependencyObject) |
ReadLocalValue(DependencyProperty) |
Returns the local value of a dependency property, if a local value is set. (Inherited from DependencyObject) |
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback) |
Registers a notification function for listening to changes to a specific DependencyProperty on this DependencyObject instance. (Inherited from DependencyObject) |
SetValue(DependencyProperty, Object) |
Sets the local value of a dependency property on a DependencyObject. (Inherited from DependencyObject) |
UnregisterPropertyChangedCallback(DependencyProperty, Int64) |
Cancels a change notification that was previously registered by calling RegisterPropertyChangedCallback. (Inherited from DependencyObject) |
Events
CurrentStateChanged |
Occurs after a control changes into a different state. |
CurrentStateChanging |
Occurs when a control begins changing into a different state. |