VisualStateGroup Clase
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Contiene objetos VisualState mutuamente excluyentes y objetos VisualTransition que se usan para pasar de un estado a otro.
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>
- Herencia
- Atributos
En este ejemplo se crea un controlTemplate simple para un botón que contiene una cuadrícula. También contiene un VisualStateGroup
denominado "CommonStates", que define los estados "PointerOver" y "Normal".
VisualStateGroup
También tiene un objeto VisualTransition que especifica que tarda una mitad en Grid
cambiar de verde a rojo cuando el usuario coloca el puntero sobre .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>
Cada VisualStateGroup
uno declarado en XAML como parte de una plantilla de control siempre debe tener un atributo x:Name establecido en él. Cada cadena de nombre usada en el conjunto de VisualStateGroups
en una plantilla de control debe ser única en esa plantilla. Sin embargo, es habitual usar los mismos nombres de grupo para distintos controles. Por ejemplo, casi todas las plantillas de control existentes tienen un VisualStateGroup
con x:Name attribute
de "CommonStates".
El conjunto de estados visuales dentro de cada VisualStateGroup
uno debe ser mutuamente excluyente en el grupo. En otras palabras, el control debe usar exactamente uno de los estados visuales de cada uno de sus grupos definidos VisualStateGroup
en todo momento. Siempre que haya un caso en el que un control esté destinado a estar simultáneamente en dos estados, asegúrese de que los dos estados están en grupos diferentes. Por ejemplo, es posible que un control desplegable se centre simultáneamente y que su lista desplegable esté abierta. En un diseño de estado visual correcto, tendría un estado independiente VisualStateGroup
para cada estado para que ambos puedan estar activos a la vez. Estos grupos pueden tener nombres como "FocusStates" y "DropDownStates".
Siempre que defina un VisualStateGroup
que habilite un comportamiento de guion gráfico temporal en uno de sus elementos VisualState , asegúrese de que el grupo también contiene un segundo VisualState
al que se puede llamar para cancelar el estado anterior. Esto puede ser tan sencillo como declarar el segundo VisualState
sin guion gráfico , solo un atributo x:Name.
El valor del atributo x:Name establecido para un VisualStateGroup
no se usa para una llamada a VisualStateManager.GoToState; en su lugar, es el x:Name attribute
de un Objeto VisualState que se usa para VisualStateManager.GoToState
. Cualquier persona que use VisualStateManager.GoToState
debe tener en cuenta todos los grupos y estados disponibles, de modo que cada llamada pase correctamente de estados antiguos a nuevos estados dentro de un grupo.
Además de un conjunto de elementos VisualState , también VisualStateGroup
puede definir un conjunto de elementos De VisualTransition , donde cada uno VisualTransition
pertenece a al menos uno de los elementos con nombre VisualState
definidos en el grupo. En XAML, el conjunto de VisualState
elementos se puede declarar como elementos secundarios del elemento object inmediato de VisualStateGroup
. Esto es posible porque la propiedad States , que es la colección de estados visuales, es la propiedad de contenido XAML para VisualStateGroup
. Por el contrario, para establecer la colección de transiciones visuales, debes declarar esa colección dentro de un elemento de propiedad VisualStateGroup.Transitions en XAML. Para obtener más información sobre las propiedades de contenido XAML, consulta la guía de sintaxis XAML.
Al usar StateTriggers para controlar los estados visuales, el motor de desencadenador usa las siguientes reglas de precedencia para puntuar desencadenadores y determinar qué desencadenador, y el valor de VisualState correspondiente, estará activo:
- Desencadenador personalizado que deriva de StateTriggerBase
- AdaptiveTrigger activado debido a MinWindowWidth
- AdaptiveTrigger activado debido a MinWindowHeight
Si hay varios desencadenadores activos a la vez que tienen un conflicto en la puntuación (es decir, dos desencadenadores personalizados activos), el primero declarado en el archivo de marcado tiene prioridad.
Nota: Aunque AdaptiveTrigger deriva de StateTriggerBase, solo se puede activar mediante la configuración de MinWindowWidth o MinWindowHeight.
Muchas de las API de VisualStateGroup
solo existen para admitir la implementación personalizada de VisualStateManager . Estos incluyen: Name, CurrentState, CurrentStateChanging, CurrentStateChanged. Los usos más comunes de estados visuales para las plantillas de control no necesitarán estas API. En concreto, no es habitual controlar los eventos. La mayoría de las operaciones lógicas de un control deben implicar sus propias propiedades y eventos. En la mayoría de los escenarios de definición de aplicaciones y controles, los cambios de estado visual que se producen en el control solo deben ser un resultado final de la lógica que el control aplica a su plantilla, no un desencadenador para otra lógica.
Visual |
Inicializa una nueva instancia de la clase VisualStateGroup . |
Current |
Obtiene el conjunto más reciente de VisualState de una llamada correcta al método GoToState . |
Dispatcher |
Siempre devuelve |
Dispatcher |
Obtiene el objeto |
Name |
Obtiene el nombre del objeto VisualStateGroup. |
States |
Obtiene la colección de objetos VisualState mutuamente excluyentes. |
Transitions |
Obtiene la colección de objetos VisualTransition . |
Clear |
Borra el valor local de una propiedad de dependencia. (Heredado de DependencyObject) |
Get |
Devuelve cualquier valor base establecido para una propiedad de dependencia, que se aplicaría en los casos en los que una animación no está activa. (Heredado de DependencyObject) |
Get |
Devuelve el valor efectivo actual de una propiedad de dependencia de dependencyObject. (Heredado de DependencyObject) |
Read |
Devuelve el valor local de una propiedad de dependencia, si se establece un valor local. (Heredado de DependencyObject) |
Register |
Registra una función de notificación para escuchar los cambios en una dependencyProperty específica en esta instancia de DependencyObject . (Heredado de DependencyObject) |
Set |
Establece el valor local de una propiedad de dependencia en dependencyObject. (Heredado de DependencyObject) |
Unregister |
Cancela una notificación de cambio registrada anteriormente llamando a RegisterPropertyChangedCallback. (Heredado de DependencyObject) |
Current |
Se produce después de que un control cambie a un estado diferente. |
Current |
Se produce cuando un control comienza a cambiar a un estado diferente. |