VisualStateManager.GoToState(Control, String, Boolean) Methode

Definition

Übergibt ein Steuerelement zwischen zwei Zuständen, indem ein neuer VisualState-Name angefordert wird.

public:
 static bool GoToState(Control ^ control, Platform::String ^ stateName, bool useTransitions);
 static bool GoToState(Control const& control, winrt::hstring const& stateName, bool const& useTransitions);
public static bool GoToState(Control control, string stateName, bool useTransitions);
function goToState(control, stateName, useTransitions)
Public Shared Function GoToState (control As Control, stateName As String, useTransitions As Boolean) As Boolean

Parameter

control
Control

Das Steuerelement, dessen Zustand gewechselt werden soll.

stateName
String

Platform::String

winrt::hstring

Der Zustand, in den der Übergang durchgeführt wird.

useTransitions
Boolean

bool

true , um eine VisualTransition zum Übergang zwischen Zuständen zu verwenden. false , um die Verwendung von Übergängen zu überspringen und direkt in den angeforderten Zustand zu wechseln. Der Standardwert ist FALSE.

Gibt zurück

Boolean

bool

true , wenn das Steuerelement erfolgreich in den neuen Zustand wechselt oder diesen Zustand bereits verwendet hat; andernfalls false.

Beispiele

In diesem Beispiel wird die Steuerungslogik veranschaulicht, die die GoToState-Methode verwendet, um zwischen Zuständen zu wechseln.

private void UpdateStates(bool useTransitions)
{
    if (Value >= 0)
    {
        VisualStateManager.GoToState(this, "Positive", useTransitions);
    }
    else
    {
        VisualStateManager.GoToState(this, "Negative", useTransitions);
    }

    if (isFocused)
    {
        VisualStateManager.GoToState(this, "Focused", useTransitions);
    }
    else
    {
        VisualStateManager.GoToState(this, "Unfocused", useTransitions);
    }

}
Private Sub UpdateStates(ByVal useTransitions As Boolean)
    If Value >= 0 Then
        VisualStateManager.GoToState(Me, "Positive", useTransitions)
    Else
        VisualStateManager.GoToState(Me, "Negative", useTransitions)
    End If

    If isFocused Then
        VisualStateManager.GoToState(Me, "Focused", useTransitions)
    Else
        VisualStateManager.GoToState(Me, "Unfocused", useTransitions)
    End If

End Sub
<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="using:NumericUpDownCustomControl"
    >
    <Style TargetType="local:NumericUpDown">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="local:NumericUpDown">
                    <Grid  Margin="3" 
                Background="{TemplateBinding Background}">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="ValueStates">
                                
                                <!--Make the Value property red when it is negative.-->
                                <VisualState x:Name="Negative">
                                    <Storyboard>
                                        <ColorAnimation To="Red"
                                    Storyboard.TargetName="TextBlock" 
                                    Storyboard.TargetProperty="(Foreground).(SolidColorBrush.Color)"/>
                                    </Storyboard>
                                </VisualState>
                                <!--Return the control to its initial state by
                    return the TextBlock Foreground to its 
                    original color.-->
                                <VisualState x:Name="Positive" />
                            </VisualStateGroup>

                            <VisualStateGroup x:Name="FocusStates">
                                <!--Add a focus rectangle to highlight the entire control
                    when it has focus.-->
                                <VisualState x:Name="Focused">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="FocusVisual" 
                                                   Storyboard.TargetProperty="Visibility" Duration="0">
                                            <DiscreteObjectKeyFrame KeyTime="0">
                                                <DiscreteObjectKeyFrame.Value>
                                                    <Visibility>Visible</Visibility>
                                                </DiscreteObjectKeyFrame.Value>
                                            </DiscreteObjectKeyFrame>
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <!--Return the control to its initial state by
                    hiding the focus rectangle.-->
                                <VisualState x:Name="Unfocused"/>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>

                        <Grid>
                            <Grid.RowDefinitions>
                                <RowDefinition/>
                                <RowDefinition/>
                            </Grid.RowDefinitions>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition/>
                                <ColumnDefinition/>
                            </Grid.ColumnDefinitions>

                            <Border BorderThickness="1" BorderBrush="Gray" 
                    Margin="7,2,2,2" Grid.RowSpan="2" 
                    Background="#E0FFFFFF"
                    VerticalAlignment="Center" 
                    HorizontalAlignment="Stretch">
                                <TextBlock x:Name="TextBlock" TextAlignment="Center" Padding="5"
                           Foreground="{TemplateBinding Foreground}"/>

                            </Border>

                            <RepeatButton Content="Up" Margin="2,5,5,0" 
                          x:Name="UpButton"
                          Grid.Column="1" Grid.Row="0"
                          Foreground="Green"/>
                            <RepeatButton Content="Down" Margin="2,0,5,5" 
                          x:Name="DownButton"
                          Grid.Column="1" Grid.Row="1" 
                          Foreground="Green"/>

                            <Rectangle Name="FocusVisual" Grid.ColumnSpan="2" Grid.RowSpan="2" 
                       Stroke="Red" StrokeThickness="1"  
                       Visibility="Collapsed"/>
                        </Grid>

                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    
</ResourceDictionary>

Hinweise

Diese Methode wird von der Steuerelementlogik verwendet. Sie benötigen es in der Regel nur, wenn Sie ein benutzerdefiniertes Steuerelement schreiben oder logik auf App-Ebene für Ansichtszustände verwenden (z. B. Aktualisieren Des App-Inhalts für Änderungen an der Größe oder Ausrichtung des App-Fensters).

Wenn Sie diese Methode aufrufen, wird erwartet, dass es einen VisualState mit einem x:Name-Wert gibt, der Ihrem stateName-Wert entspricht, irgendwo in der Steuerelementvorlage für das steuerelement identifizierte Steuerelement oder als Ressource für Ihre App. Wenn dies nicht der Fall ist, erhalten Sie keine Ausnahmen, aber der Rückgabewert ist false. Der Zustand mit dem Namen stateName kann sich in jedem der VisualStateGroup-Elemente in der Vorlage für das angegebene Steuerelement befinden. Es liegt an Ihnen, nachzuverfolgen, welche Zustände sich in welcher VisualStateGroup befinden, und zu wissen, welcher Zustand entladen wird, wenn Sie einen neuen Zustand aus dieser Gruppe angeben.

In der Regel ist die ControlTemplate, die die visuellen Zustände enthält, auf die bei Verwendung von GoToState durch Den Namen verwiesen wird, nicht speziell für dieses Steuerelement instance definiert. Stattdessen stammen die visuellen Zustände aus der Standardsteuerungsart, die als implizite Formatvorlage für alle Instanzen dieses Steuerelements geladen wird. Weitere Informationen zum impliziten Stilkonzept finden Sie unter Schnellstart: Steuerelementvorlagen.

VisualStateManager unterstützt zwei wichtige Features für Steuerelementautoren und für App-Entwickler, die eine benutzerdefinierte Vorlage auf ein Steuerelement anwenden:

  • Steuerelementautoren oder App-Entwickler fügen visualStateGroup-Objektelemente zum Stammelement einer Steuerelementvorlagendefinition in XAML mithilfe der angefügten VisualStateManager.VisualStateGroups-Eigenschaft hinzu. Innerhalb eines VisualStateGroup-Elements stellt jeder VisualState einen diskreten visuellen Zustand eines Steuerelements dar. Jeder VisualState hat einen Namen, der für einen Benutzeroberflächenstatus repräsentativ ist, der vom Benutzer geändert oder durch die Steuerelementlogik geändert werden kann. Ein VisualState besteht hauptsächlich aus einem Storyboard. Dieses Storyboard zielt auf einzelne Abhängigkeitseigenschaftenwerte ab, die angewendet werden sollten, wenn sich das Steuerelement in diesem visuellen Zustand befindet.
  • Steuerelementautoren oder App-Entwickler wechseln zwischen diesen Zuständen, indem sie die statische GoToState-Methode von VisualStateManager aufrufen. Steuerelementautoren tun dies immer dann, wenn die Steuerelementlogik Ereignisse verarbeitet, die auf eine Zustandsänderung hinweisen, oder die Steuerungslogik initiiert eine Zustandsänderung selbst. Es ist häufiger, dass Steuerelementdefinitionscode dies anstelle von App-Code tut, sodass alle möglichen visuellen Zustände und deren Übergänge und Triggerbedingungen standardmäßig für App-Code vorhanden sind. Oder es ist der App-Code, der die visuellen Zustände ändert, um Ansichtszustände auf App-Ebene als Reaktion auf benutzergesteuerte Änderungen an der Größe oder Ausrichtung des Standard App-Fensters zu verwalten.

Wenn Sie GoToState aufrufen, um den visuellen Zustand eines Steuerelements zu ändern, führt VisualStateManager die folgenden Aktionen aus:

  • Zunächst wird ermittelt, ob ein Zustand vorhanden ist, der stateName entspricht. Andernfalls geschieht nichts, und die Methode gibt false zurück.
  • Wenn visualState als name by stateName vorhanden ist und über ein Storyboard verfügt, beginnt das Storyboard.
  • Wenn der VisualState , den das Steuerelement aus derselben VisualStateGroup vor dem neu angeforderten Zustand verwendet hat, über ein Storyboard verfügt, wird dieses Storyboard beendet. Abgesehen von den spezifischen Eigenschaften, auf die das neue VisualState eine Animation anwendet, wird das Steuerelement auf die ursprünglich geladenen Zustände aus der Steuerelementvorlage und deren Zusammensetzung zurückgesetzt.

Wenn sich das Steuerelement bereits im angeforderten VisualState als stateName befindet, gibt GoToState true zurück, andernfalls gibt es jedoch keine Aktion (das Storyboard wird nicht neu gestartet).

Ein gängiges Steuerelementimplementierungsmuster besteht darin, eine einzelne private Methode der Steuerelementklasse zu definieren, die sich um alle möglichen VisualState-Änderungen für das Steuerelement kümmert. Welcher visuelle Zustand verwendet werden soll, wird durch Überprüfen der Eigenschaften des Steuerelements bestimmt. Diese Eigenschaften können öffentlich oder privat sein. Werte von Eigenschaften werden von Handlern in der Steuerungslogik für Ereignisse wie OnGotFocus angepasst und unmittelbar vor dem Festlegen des visuellen Zustands just-in-time überprüft. Das Codebeispiel in diesem Thema verwendet dieses Implementierungsmuster. Alternativ können Sie GoToState für einzelne Zustände innerhalb von Ereignishandlern, von Steuerelementereignishandlerüberschreibungen (onEvent-Methoden ) oder von Hilfsmethoden aufrufen, die von allen möglichen Impulsen für sich ändernde Zustände aufgerufen werden (benutzergesteuerte Ereignisse, Automatisierungsereignisse, Initialisierungslogik).

Sie können GoToState auch aus der PropertyChangedCallback-Implementierung für eine benutzerdefinierte Abhängigkeitseigenschaft aufrufen.

Visuelle Zustände und Übergänge

Zusätzlich zu den visuellen Zuständen enthält das visuelle Zustandsmodell auch Übergänge. Übergänge sind Animationsaktionen, die von einem Storyboard gesteuert werden und zwischen jedem visuellen Zustand auftreten, wenn der Zustand geändert wird. Der Übergang kann für jede Kombination aus Start- und Endzustand anders definiert werden, wie durch den Satz visueller Zustände Ihres Steuerelements definiert. Übergänge werden durch die Transitions-Eigenschaft von VisualStateGroup definiert und werden normalerweise in XAML definiert. Die meisten Standardsteuerelementvorlagen definieren keine Übergänge, und in diesem Fall erfolgen die Übergänge zwischen Zuständen sofort. Weitere Informationen finden Sie unter VisualTransition.

Eine VisualTransition kann auch so definiert werden, dass sie einen impliziten Übergang erzeugt. Jede Abhängigkeitseigenschaft, die speziell für die Animation in den Visuellen Zuständen From oderTo einer VisualTransition bestimmt ist und über unterschiedliche Werte für die Zustandsänderung verfügt, kann mit einer impliziten Übergangsanimation animiert werden. Diese generierte Animation wechselt zwischen dem Wert from state und dem To state value einer solchen Eigenschaft mithilfe von Interpolation. Die implizite Übergangsanimation dauert für die Zeit, die vom GeneratedDuration-Wert einer VisualTransition angegeben wird. Implizite Übergänge gelten nur für Eigenschaften, die einen Double-, Color- oder Point-Wert sind. Mit anderen Worten, die Eigenschaft muss implizit mit einer DoubleAnimation, PointAnimation oder ColorAnimation animiert werden können. Weitere Informationen finden Sie unter GeneratedDuration.

Ereignisse für Änderungen des visuellen Zustands

CurrentStateChanging wird ausgelöst, wenn das Steuerelement beginnt, die Vom GoToState-Aufruf angeforderten Übergangszustände zu überstellen. Wenn eine VisualTransition auf die Zustandsänderung angewendet wird, tritt dieses Ereignis auf, wenn der Übergang beginnt.

CurrentStateChanged wird ausgelöst, nachdem sich das Steuerelement in dem vom GoToState-Aufruf angeforderten Zustand befindet, genau wie das neue Storyboard beginnt. Beim Abschluss des neuen Storyboards wird kein Ereignis ausgelöst.

Wenn eine VisualTransition nicht angewendet wird, werden CurrentStateChanging und CurrentStateChanged in schneller Folge ausgelöst, sind aber in dieser Reihenfolge garantiert, wenn beide auftreten.

Wenn ein Zustandsänderungsübergang jedoch durch einen neuen GoToState-Aufruf unterbrochen wird, wird das CurrentStateChanged-Ereignis für den ersten Zustandsübergang nie ausgelöst. Eine neue Ereignisreihe wird für die nächste angeforderte Zustandsänderung ausgelöst.

OnApplyTemplate wird nicht für Visuelle Zustandsänderungen aufgerufen. OnApplyTemplate wird nur für das anfängliche Laden eines Steuerelements in einer XAML-Benutzeroberfläche aufgerufen.

Attributieren der benannten visuellen Zustände eines benutzerdefinierten Steuerelements

Wenn Sie ein benutzerdefiniertes Steuerelement definieren, das visuelle Zustände im XAML-Code der Steuerelementvorlage aufweist, empfiehlt es sich, die Steuerelementklasse zu attributieren, um steuerelementbasierten Consumern anzugeben, welche visuellen Zustände verfügbar sind. Wenden Sie hierzu mindestens ein TemplateVisualState-Attribut auf der Klassenebene Ihres Steuerelementdefinitionscodes an. Jedes Attribut sollte das x:Name-Attribut des Zustands angeben. Dabei handelt es sich um den stateName-Wert , den ein Steuerelement-Consumer in einem GoToState-Aufruf übergeben würde, um diesen visuellen Zustand zu verwenden. Wenn visualState Teil einer VisualStateGroup ist, sollte dies auch in der Attributdefinition angegeben werden.

Ein verwandtes Konzept besteht darin, dass Steuerelementautoren die Namen von wichtigen Steuerelementteilen mithilfe von TemplatePartAttribute zuordnen sollten. Dies ist sehr hilfreich, wenn Steuerelementbenutzer auf benannte Teile aus dem Vorlagenbereich zugreifen möchten, nachdem die Vorlage angewendet wurde. Die Kombination von TemplateVisualStateAttribute und TemplatePartAttribute hilft beim Definieren des Steuerelementvertrags für ein Steuerelement.

Benutzerdefinierter VisualStateManager

Als erweitertes Szenario ist es möglich, von VisualStateManager abzuleiten und das GoToState-Standardverhalten zu ändern. Die abgeleitete Klasse sollte die geschützte GoToStateCore-Methode außer Kraft setzen. Jede instance des benutzerdefinierten VisualStateManager verwendet diese Core-Logik, wenn die GoToState-Methode aufgerufen wird.

Visuelle Zustände für App-Ansichtszustände

Visuelle Zustände sind nicht unbedingt für benutzerdefinierte Steuerelemente geeignet. Sie können visuelle Zustände aus neuen Steuerelementvorlagen verwenden, die Sie auf alle Control-instance verwenden, in denen Sie die Standardvorlage ersetzen, indem Sie die Template-Eigenschaft festlegen. Um dies einzurichten, müssen Sie die Steuerelementvorlage und die visuellen Zustände definieren, die Sie als Style-Ressource verwenden möchten, die sich in oder Page.Resources befindet Application.Resources. Es ist immer am besten, mit einer Kopie der Standardvorlage zu beginnen und nur bestimmte Aspekte der Vorlage zu ändern oder auch nur einige der visuellen Zustände zu ändern und die grundlegende Komposition allein zu lassen. Weitere Informationen finden Sie unter Schnellstart: Steuerelementvorlagen.

Visuelle Zustände können verwendet werden, um die Eigenschaften einer Seite oder von Steuerelementen innerhalb der Seite zu ändern, um die Ausrichtung des App-Fensters zu berücksichtigen. Ihre Komposition oder die layoutbezogenen Eigenschaftswerte Ihres Steuerelements können sich ändern, je nachdem, ob die Gesamtausrichtung hoch- oder querformatiert ist. Weitere Informationen zu diesem Szenario für GoToState finden Sie unter Schnellstart: Entwerfen von Apps für verschiedene Fenstergrößen.

Visuelle Zustände für Elemente, die keine Steuerelemente sind

Visuelle Zustände sind manchmal nützlich für Szenarien, in denen Sie den Zustand eines Bereichs der Benutzeroberfläche ändern möchten, der nicht sofort eine Control-Unterklasse ist. Sie können dies nicht direkt tun, da der Steuerelementparameter der GoToState-Methode eine Control-Unterklasse erfordert, die auf das Objekt verweist, auf das visualStateManager reagiert. Seite ist eine Steuerelement-Unterklasse , und es ist ziemlich selten, dass Sie die Benutzeroberfläche in einem Kontext anzeigen, in dem Sie keine Seite haben, oder Ihr Window.Content-Stamm ist keine Control-Unterklasse . Es wird empfohlen, ein benutzerdefiniertes UserControl zu definieren, um entweder als Window.Content-Stamm oder als Container für andere Inhalte zu definieren, auf die Sie Zustände anwenden möchten (z. B. einen Bereich). Anschließend können Sie GoToState für Ihr UserControl aufrufen und Zustände anwenden, unabhängig davon, ob es sich bei dem restlichen Inhalt um ein Steuerelement handelt. Beispielsweise können Sie visuelle Zustände auf die Benutzeroberfläche anwenden, die andernfalls nur aus einem SwapChainPanel besteht, solange Sie diese in Ihrem UserControl-Objekt platzieren und benannte Zustände deklariert haben, die für die Eigenschaften des übergeordneten UserControl-Objekts oder des benannten SwapChainPanel-Teils der Vorlage gelten.

Gilt für:

Weitere Informationen