Share via


VisualStateManager.GoToState(Control, String, Boolean) Methode

Definition

Übergibt ein Steuerelement zwischen zwei Zuständen, indem ein neues VisualState anhand des Namens 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 für den Ü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 lautet false.

Gibt zurück

Boolean

bool

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

Beispiele

In diesem Beispiel wird die Steuerungslogik veranschaulicht, die die GoToState-Methode für den Übergang zwischen Zuständen verwendet.

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);
    }

}
<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 Steuerungslogik 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 Sie Ihren App-Inhalt bei Änderungen an der Größe oder Ausrichtung des App-Fensters).

Wenn Sie diese Methode aufrufen, wird erwartet, dass ein VisualState mit einem x:Name Wert vorhanden ist, der Ihrem stateName Wert entspricht, irgendwo in der Steuerelementvorlage für das steuerelement, das durch controloder als Ressource für Ihre App identifiziert wird. Wenn dies nicht der Fall ist, erhalten Sie keine Ausnahmen, aber der Rückgabewert ist false. Der Zustand mit dem Namen von 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 welchem VisualStateGroup Zustand 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 GoToState durch den Namen verwiesen wird, nicht speziell für dieses Steuerelement instance definiert. Stattdessen stammen die visuellen Zustände aus dem Standardsteuerelementstil, der als impliziter Stil für alle Instanzen dieses Steuerelements geladen wird. Weitere Informationen zum impliziten Stilkonzept finden Sie unter XAML-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 dem Stammelement einer Steuerelementvorlagendefinition in XAML mithilfe der VisualStateManager.VisualStateGroups angefügten Eigenschaft hinzu. Innerhalb eines VisualStateGroup Elements stellt jeder VisualState einen diskreten visuellen Zustand eines Steuerelements dar. Jedes VisualState hat einen Namen, der für einen Benutzeroberflächenzustand steht, der vom Benutzer geändert oder durch Steuerelementlogik geändert werden kann. Ein VisualState besteht hauptsächlich aus einem Storyboard. Dies Storyboard zielt auf einzelne Abhängigkeitseigenschaftswerte ab, die angewendet werden sollen, 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, 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 visuelle 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 aufrufen GoToState , um den visuellen Zustand eines Steuerelements zu ändern, führt VisualStateManager die folgenden Aktionen aus:

  • Zunächst wird bestimmt, ob ein Zustand vorhanden ist, der übereinstimmt stateName . Wenn dies nicht der Fall ist, geschieht nichts, und die -Methode gibt zurück false.
  • Wenn visualState , wie von stateName benannt, 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 der neue VisualState eine Animation anwendet, wird das Steuerelement auf die anfänglich geladenen Zustände aus der Steuerelementvorlage und deren Zusammensetzung zurückgesetzt.

Wenn sich das Steuerelement bereits im angeforderten VisualState als stateName befindet, gibt zurücktrue, GoToState aber andernfalls gibt es 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 Steuerelementlogik für Ereignisse wie OnGotFocus angepasst und unmittelbar vor dem Festlegen des visuellen Zustands just-in-time überprüft. Im Codebeispiel in diesem Thema wird dieses Implementierungsmuster verwendet. Alternativ können Sie GoToState für einzelne Zustände innerhalb von Ereignishandlern, aus Steuerelementereignishandlerüberschreibungen (onEvent-Methoden ) oder von Hilfsmethoden aufrufen, die von allen möglichen Impulsen für 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 umfasst 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 Startzustand und Endzustand unterschiedlich definiert werden, wie durch den Satz visueller Zustände Ihres Steuerelements definiert. Übergänge werden durch die Transitions-Eigenschaft von VisualStateGroup definiert und in der Regel 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 Animationen in den visuellen ZuständenVisualTransition Von oderAn ausgerichtet ist und über unterschiedliche Werte für die Zustandsänderung verfügt, kann mit einer impliziten Übergangsanimation animiert werden. Diese generierte Animation übergibt zwischen dem Wert from state und dem To state-Wert einer solchen Eigenschaft mithilfe von Interpolation. Die implizite Übergangsanimation dauert für die Zeit, die vom GeneratedDuration-Wert eines VisualTransitionangegeben wird. Implizite Übergänge gelten nur für Eigenschaften, die ein Double-, Color- oder Point-Wert sind. Anders ausgedrückt: Die -Eigenschaft muss implizit mithilfe von 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, Zustände zu übergehen, wie vom GoToState Aufruf angefordert. 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 kurzer Folge ausgelöst, sind jedoch in dieser Reihenfolge garantiert, wenn beide auftreten.

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

OnApplyTemplate wird nicht für Visuelle Zustandsänderungen aufgerufen. OnApplyTemplate wird nur für das anfängliche Laden eines Steuerelements in eine 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 zuzuordnen, um den Steuerelementconsumern anzugeben, welche visuellen Zustände verfügbar sind. Wenden Sie dazu 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 Steuerelementconsumer 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 Steuerelementconsumer 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 Standardverhalten GoToState zu ändern. Die abgeleitete Klasse sollte die geschützte GoToStateCore-Methode überschreiben. 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 vorgesehen. Sie können visuelle Zustände aus neuen Steuerelementvorlagen verwenden, die Sie auf alle Control-instance anwenden, 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 entweder Page.Resources in oder befindet Application.Resources. Es ist immer am besten, mit einer Kopie der Standardvorlage zu beginnen und nur bestimmte Aspekte der Vorlage zu ändern oder sogar nur einige der visuellen Zustände zu ändern und die grundlegende Komposition allein zu lassen. Weitere Informationen finden Sie unter XAML-Steuerelementvorlagen.

Visuelle Zustände können verwendet werden, um 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 GoToStatefinden Sie unter Responsive Layouts mit XAML.

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. Dies ist nicht direkt möglich, da der Steuerelementparameter der GoToState -Methode eine Control Unterklasse erfordert, die auf das Objekt verweist, auf das visualStateManager reagiert. Page ist eine Control Unterklasse, und es ist ziemlich selten, dass Die Benutzeroberfläche in einem Kontext angezeigt wird, in dem Sie keine haben Pageoder ihr Window.Content-Stamm keine Control Unterklasse ist. Es wird empfohlen, ein benutzerdefiniertes UserControl-Steuerelement zu definieren, um entweder als Window.Content Stamm oder als Container für andere Inhalte zu dienen, auf die Sie Zustände anwenden möchten (z. B. ein Panel). Anschließend können Sie für den UserControl Status und die Anwendung aufrufenGoToState, unabhängig davon, ob der Rest des Inhalts ein Controlist. Beispielsweise könnten Sie visuelle Zustände auf die Benutzeroberfläche anwenden, die andernfalls nur aus einem SwapChainPanel besteht, solange Sie diese innerhalb ihrer UserControl und deklarierten benannten Zustände platziert haben, die für die Eigenschaften des übergeordneten UserControl oder des benannten SwapChainPanel Teils der Vorlage gelten.

Gilt für:

Weitere Informationen