VisualStateManager.GoToState(Control, String, Boolean) Methode
Definition
Wichtig
Einige Informationen beziehen sich auf Vorabversionen, die vor dem Release ggf. grundlegend überarbeitet werden. Microsoft übernimmt hinsichtlich der hier bereitgestellten Informationen keine Gewährleistungen, seien sie ausdrücklich oder konkludent.
Ü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
bool
true
, wenn das Steuerelement erfolgreich in den neuen Zustand wechselt oder diesen Zustand bereits verwendet hat; false
andernfalls .
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 control
oder 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 einesVisualStateGroup
Elements stellt jeder VisualState einen diskreten visuellen Zustand eines Steuerelements dar. JedesVisualState
hat einen Namen, der für einen Benutzeroberflächenzustand steht, der vom Benutzer geändert oder durch Steuerelementlogik geändert werden kann. EinVisualState
besteht hauptsächlich aus einem Storyboard. DiesStoryboard
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ückfalse
. - 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 VisualTransition
angegeben 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 GoToState
finden 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 Page
oder 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 Control
ist. 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.