VisualStateManager.GoToElementState(FrameworkElement, String, Boolean) 方法

定义

使元素在两个状态间转换。 使用此方法转换由应用程序(而非控件)定义的状态。

public:
 static bool GoToElementState(System::Windows::FrameworkElement ^ stateGroupsRoot, System::String ^ stateName, bool useTransitions);
public static bool GoToElementState (System.Windows.FrameworkElement stateGroupsRoot, string stateName, bool useTransitions);
static member GoToElementState : System.Windows.FrameworkElement * string * bool -> bool
Public Shared Function GoToElementState (stateGroupsRoot As FrameworkElement, stateName As String, useTransitions As Boolean) As Boolean

参数

stateGroupsRoot
FrameworkElement

包含 VisualStateManager 的根元素。

stateName
String

要转换到的状态。

useTransitions
Boolean

要使用 VisualTransition 对象进行状态切换,则为 true;否则为 false

返回

Boolean

如果控件已成功过渡到新状态,则为 true;否则为 false

例外

stateGroupsRootnull

  • 或 - stateNamenull

示例

以下示例创建一个应用程序,提示用户猜测介于 1 和 100 之间的数字。 当用户输入数字时,应用程序指示猜测是否过高、太低或正确。 以下 XAML 为应用程序创建用户界面,并定义 4 种状态: TooLowTooHighCorrectGuessing。 应用程序启动时,它处于 Guessing 状态。 .

<Grid x:Name="LayoutRoot">
  <Grid.Background>
    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
      <GradientStop Color="#FF022343" Offset="0"/>
      <GradientStop Color="#FF006BD2" Offset="1"/>
    </LinearGradientBrush>
  </Grid.Background>
  <VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="ResultStates">
      <VisualStateGroup.Transitions>
        <VisualTransition GeneratedDuration="0:0:0.5">
          <VisualTransition.GeneratedEasingFunction>
            <CubicEase EasingMode="EaseOut"/>
          </VisualTransition.GeneratedEasingFunction>
        </VisualTransition>
      </VisualStateGroup.Transitions>
      <VisualState x:Name="TooLow">
        <Storyboard>
          <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingColorKeyFrame KeyTime="0" Value="#FFD22700"/>
          </ColorAnimationUsingKeyFrames>
          <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[0].(GradientStop.Color)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingColorKeyFrame KeyTime="0" Value="#FFE2D7D0"/>
          </ColorAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(UIElement.RenderTransform).
              (TransformGroup.Children)[0].(ScaleTransform.ScaleX)" 
            Storyboard.TargetName="viewbox">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
          </DoubleAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(UIElement.RenderTransform).
              (TransformGroup.Children)[0].(ScaleTransform.ScaleY)" 
            Storyboard.TargetName="viewbox">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
          </DoubleAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[0].(GradientStop.Offset)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/>
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </VisualState>
      <VisualState x:Name="TooHigh">
        <Storyboard>
          <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingColorKeyFrame KeyTime="0" Value="#FFF3EBE9"/>
          </ColorAnimationUsingKeyFrames>
          <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[0].(GradientStop.Color)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingColorKeyFrame KeyTime="0" Value="#FFF12807"/>
          </ColorAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(UIElement.RenderTransform).
              (TransformGroup.Children)[0].(ScaleTransform.ScaleX)" 
            Storyboard.TargetName="viewbox">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
          </DoubleAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(UIElement.RenderTransform).
              (TransformGroup.Children)[0].(ScaleTransform.ScaleY)" 
            Storyboard.TargetName="viewbox">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
          </DoubleAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[1].(GradientStop.Offset)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.5"/>
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </VisualState>
      <VisualState x:Name="Correct">
        <Storyboard>
          <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[0].(GradientStop.Color)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingColorKeyFrame KeyTime="0" Value="#FF0E4302"/>
          </ColorAnimationUsingKeyFrames>
          <ColorAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(Panel.Background).
              (GradientBrush.GradientStops)[1].(GradientStop.Color)" 
            Storyboard.TargetName="LayoutRoot">
            <EasingColorKeyFrame KeyTime="0" Value="#FF14D200"/>
          </ColorAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(UIElement.RenderTransform).
              (TransformGroup.Children)[0].(ScaleTransform.ScaleX)" 
            Storyboard.TargetName="viewbox">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
          </DoubleAnimationUsingKeyFrames>
          <DoubleAnimationUsingKeyFrames 
            Storyboard.TargetProperty="(UIElement.RenderTransform).
              (TransformGroup.Children)[0].(ScaleTransform.ScaleY)" 
            Storyboard.TargetName="viewbox">
            <EasingDoubleKeyFrame KeyTime="0" Value="1"/>
          </DoubleAnimationUsingKeyFrames>
        </Storyboard>
      </VisualState>
      <VisualState x:Name="Guessing"/>
    </VisualStateGroup>
  </VisualStateManager.VisualStateGroups>
  <Grid.RowDefinitions>
    <RowDefinition Height="Auto"/>
    <RowDefinition Height="Auto"/>
    <RowDefinition/>
  </Grid.RowDefinitions>
  <Grid.ColumnDefinitions>
    <ColumnDefinition/>
    <ColumnDefinition Width="247"/>
  </Grid.ColumnDefinitions>
  <TextBlock Grid.Row="0" Grid.ColumnSpan="2" Margin="20,5,20,5" 
             FontSize="24" Foreground="White"
             Text="Guess a number between 1 and 100"/>
  <TextBox x:Name="Guess" Grid.Row="1" Margin="20,20,10,10" 
           TextWrapping="Wrap" FontSize="48" 
           TextChanged="OnTypingGuess"/>
  <Button x:Name="GuessButton" Grid.Row="1" Content="Guess" 
          Margin="10,20,20,10" Grid.Column="1" 
          FontSize="48" Click="OnGuess" 
          IsDefault="True"/>
  <Viewbox x:Name="viewbox" Grid.ColumnSpan="2" Grid.Row="2"
           Margin="20,10,20,20" RenderTransformOrigin="0.5,0.5">
    <Viewbox.RenderTransform>
      <TransformGroup>
        <ScaleTransform ScaleX="0" ScaleY="0"/>
        <SkewTransform/>
        <RotateTransform/>
        <TranslateTransform/>
      </TransformGroup>
    </Viewbox.RenderTransform>
    <TextBlock x:Name="Result" TextWrapping="Wrap"/>
  </Viewbox>
</Grid>

以下代码显示了应用程序的逻辑。 当用户输入号码并单击该按钮时,应用程序将调用 GoToElementState 转换到 TooHigh该按钮, TooLowCorrect 向用户提供有关猜测的反馈。 若要尝试此示例,请在应用程序启动时调用 GenerateNumber 该方法。

int number;

private void GenerateNumber()
{
    System.Random r = new System.Random();
    number = r.Next(100) + 1;
}

private void OnGuess(object sender, System.Windows.RoutedEventArgs e)
{
    int guess;

    if (int.TryParse(this.Guess.Text, out guess))
    {
        if (guess < this.number)
        {
            VisualStateManager.GoToElementState(this.LayoutRoot, "TooLow", true);
            this.Result.Text = "Too Low!";
        }
        else if (guess > this.number)
        {
            VisualStateManager.GoToElementState(this.LayoutRoot, "TooHigh", true);
            this.Result.Text = "Too High!";
        }
        else
        {
            VisualStateManager.GoToElementState(this.LayoutRoot, "Correct", true);
            this.Result.Text = "Correct!";
        }
    }
}

private void OnTypingGuess(object sender, System.Windows.Controls.TextChangedEventArgs e)
{
    VisualStateManager.GoToElementState(this.LayoutRoot, "Guessing", true);
    this.Result.Text = "";
}
Private number As Integer

Private Sub GenerateNumber()
    Dim r As New System.Random()
    number = r.Next(100) + 1
End Sub

Private Sub OnGuess(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs)
    Dim guess As Integer

    If Integer.TryParse(Me.Guess.Text, guess) Then
        If guess < Me.number Then
            VisualStateManager.GoToElementState(Me.LayoutRoot, "TooLow", True)
            Me.Result.Text = "Too Low!"
        ElseIf guess > Me.number Then
            VisualStateManager.GoToElementState(Me.LayoutRoot, "TooHigh", True)
            Me.Result.Text = "Too High!"
        Else
            VisualStateManager.GoToElementState(Me.LayoutRoot, "Correct", True)
            Me.Result.Text = "Correct!"
        End If
    End If
End Sub

Private Sub OnTypingGuess(ByVal sender As Object, ByVal e As System.Windows.Controls.TextChangedEventArgs)
    VisualStateManager.GoToElementState(Me.LayoutRoot, "Guessing", True)
    Me.Result.Text = ""
End Sub

注解

GoToElementState调用此方法以更改 (外部ControlTemplate元素的状态(例如,如果使用VisualStateManagerDataTemplate Window) )。 GoToState如果在控件中更改了使用该VisualStateManager控件ControlTemplate的状态,则调用该方法。

适用于