Определить, активна ли раскадровка, если myStoryboard еще не начался?

#c# #wpf #vb.net #animation #storyboard

#c# #wpf #vb.net #Анимация #раскадровка

Вопрос:

1- Скопируйте и вставьте следующий код в файл MainWindow.xaml.

 <Window x:Class="MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
    <Label x:Name="Label1" Height="25" Width="100" Background="Gainsboro"/>
    <TextBox x:Name="TextBox1" Height="25" Width="100" Background="Pink" Text="Hello"/>
</StackPanel>
</Window>
  

2- Скопируйте и вставьте следующий код в код за файлом.

 Class MainWindow

Private WithEvents myDispatcherTimer As New System.Windows.Threading.DispatcherTimer

Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    AddHandler myDispatcherTimer.Tick, AddressOf myCode_Tick
    myDispatcherTimer.Interval = TimeSpan.FromSeconds(0.5)
    myDispatcherTimer.Start()
End Sub

Private Sub myCode_Tick(ByVal sender As Object, ByVal e As EventArgs)

    Dim myColorAnimation As New Animation.ColorAnimation With {.From = Colors.Transparent, .To = Colors.Red, .Duration = TimeSpan.FromSeconds(0.4), .AutoReverse = True}
    Animation.Storyboard.SetTargetName(element:=myColorAnimation, name:="Label1")
    Animation.Storyboard.SetTargetProperty(element:=myColorAnimation, path:=New PropertyPath("(Label.Background).(SolidColorBrush.Color)"))
    Dim myStoryboard As New Animation.Storyboard
    myStoryboard.Children.Add(myColorAnimation)

    If Not TextBox1.Text = "Hello" Then
        myStoryboard.Begin(containingObject:=Me, isControllable:=True, handoffBehavior:=Animation.HandoffBehavior.SnapshotAndReplace)
    Else
        If myStoryboard.GetCurrentState(containingObject:=Me) = Animation.ClockState.Active Then
            myStoryboard.Stop(containingObject:=Me)
        End If
    End If

End Sub

End Class
  

3- Запустите этот проект, подождите две секунды и увидите эту ошибку:https://prnt.sc/n08a3j

Сообщение об ошибке:

Не удается выполнить действие, поскольку указанная раскадровка не была применена к этому объекту для интерактивного управления

Итак, как я могу устранить эту ошибку?

Как определить, активна ли раскадровка, если myStoryboard еще не начался?

Ответ №1:

Здесь есть 2 проблемы, первая из которых заключается в том, что ваш код не вызывает Begin метод, если текст не изменен. Begin Метод, однако, определяет, является ли раскадровка Storyboard управляемой.

Для того, чтобы вызвать GetCurrentState , ему нужен этот управляемый флаг.

Поэтому убедитесь, что вы вызываете Begin сначала (я не знаю, что ваше приложение должно делать с исходным текстом, но вы имели в виду использовать оператор NOT в If NOT TextBox1.Text = "Hello" Then ?

Во-вторых, вы хотите передать containingObject в GetCurrentState :

If myStoryboard.GetCurrentState(containingObject:=Me) = Animation.ClockState.Active Then

Я применил 2 изменения, и приложение может запускать анимацию без исключений.