无法对 WPF 中图像的位置进行动画处理

Unable to animate the position of an image in a WPF

提问人:Trodgy 提问时间:9/22/2023 最后编辑:Trodgy 更新时间:9/22/2023 访问量:32

问:

好的,所以我有一个由默认窗口的.vb脚本创建的类。 这个类创建一个具有一些基本移动控制以及一些重力的玩家。 播放器由一个图像和其他几个位组成,旨在通过使用 DoubleAnimations 的 Storyboard 四处移动。

问题是,无论我尝试多少种不同的方法使 DoubleAnimations 正常工作,我似乎都无法让它正常工作。

我将代码缩减为更易于理解的部分,这些部分侧重于真正重要的部分。

    Dim Timer As System.Windows.Threading.DispatcherTimer = New System.Windows.Threading.DispatcherTimer(System.Windows.Threading.DispatcherPriority.Normal, Application.Current.Dispatcher)
    Public PlayerVisualInstance As Image
    Public MainWindowClass As MainWindow

    Public XPositionMoving As Boolean = False
    Public YPositionMoving As Boolean = False
    Public Shared TweenRequests As String() = New String(8) {"0", "0", "0", "Positive", "Positive", "Positive", "0", "0", "0"}
    Public WithEvents TweenStoryboard As Storyboard = New Storyboard
    Public VisualInstanceTransformGroup As New TransformGroup
    Public VisualInstanceTranslateTransform As New TranslateTransform
    Public Shared TweenShouldRun As Boolean = False
    Public Shared TweenDone As Boolean = True
    Public Shared TweenDebounce As Boolean = False

    Public Sub New()
        AddHandler Timer.Tick, AddressOf Timer_Tick
        Timer.Interval = TimeSpan.FromMilliseconds(1)
        Timer.Start()
        PlayerVisualInstance = New Image
        PlayerVisualInstance.HorizontalAlignment = HorizontalAlignment.Left
        PlayerVisualInstance.VerticalAlignment = VerticalAlignment.Top
        PlayerVisualInstance.Stretch = Stretch.Uniform
        PlayerVisualInstance.StretchDirection = StretchDirection.Both
        PlayerVisualInstance.SnapsToDevicePixels = True
        VisualInstanceTransformGroup.Children.Add(VisualInstanceTranslateTransform)
        PlayerVisualInstance.RenderTransform = VisualInstanceTransformGroup
    End Sub

    Public Sub CharacterProcessing()
        'tons and tons of processing bits which aren't relevant here
        TweenStuff()
    End Sub

    Private Sub StoryboardCompletion() Handles TweenStoryboard.Completed
        TweenDone = True
        'TweenDebounce = False
        'like this just to ensure that a tween only runs once for testing
        XPositionMoving = False
        YPositionMoving = False
    End Sub

    Public Sub TweenStuff()
        If TweenShouldRun = True Then
            TweenShouldRun = False

            Dim XConvert As Decimal = CType(TweenRequests(0), Decimal)
            Dim YConvert As Decimal = CType(TweenRequests(1), Decimal)
            Dim XAmountConvert As Decimal = CType(TweenRequests(6), Decimal)
            Dim YAmountConvert As Decimal = CType(TweenRequests(7), Decimal)

            Dim TweenAnimationX As DoubleAnimation = New DoubleAnimation()
            Dim TweenAnimationY As DoubleAnimation = New DoubleAnimation()
            TweenAnimationX.From = VisualInstanceTranslateTransform.X
            TweenAnimationX.To = XConvert
            TweenAnimationY.From = VisualInstanceTranslateTransform.Y
            TweenAnimationY.To = YConvert
            TweenAnimationX.Duration = New Duration(TimeSpan.FromSeconds(XAmountConvert))
            TweenAnimationY.Duration = New Duration(TimeSpan.FromSeconds(YAmountConvert))
            Storyboard.SetTarget(TweenAnimationX, PlayerVisualInstance)
            Storyboard.SetTarget(TweenAnimationY, PlayerVisualInstance)
            Storyboard.SetTargetProperty(TweenAnimationX, New PropertyPath(VisualInstanceTranslateTransform.X))
            Storyboard.SetTargetProperty(TweenAnimationY, New PropertyPath(VisualInstanceTranslateTransform.Y))
            TweenStoryboard.Children.Add(TweenAnimationX)
            TweenStoryboard.Children.Add(TweenAnimationY)
            TweenStoryboard.Begin()
        End If
    End Sub
    Private Sub Timer_Tick(sender As Object, e As EventArgs)
        CharacterProcessing()
    End Sub

为了提供一些细节,TweenRequests 包含一系列要在补间中使用的值,主要使用的值是 0、1、6 和 7,它们分别是 X 和 Y 端点以及每个端点的持续时间。

在类之外,某些值被设置为无法从 Sub New() 立即设置的播放器,这包括在 TranslateTransform 上运行 RegisterName。

tick 语句用于遍历所有内容,并不断使情节提要内容保持最新状态。可能有一种更优化的方法可以做到这一点,但它是有效的。

然而,不起作用的部分是故事板动画本身。

我尝试了各种方法,例如切换到 ThicknessAnimations、在 SetTargetProperty 中设置不同的属性以及试验 TranslateTransforms。这些方法都没有正常工作,除了一个实例,它稍微起作用,但随后立即中断,下次我编译时没有显示结果。在所有这些时候,它有时甚至根本没有错误,但对事物没有任何明显的影响(即使我通过调试证明情节提要确实可以正常播放),或者它在 Storyboard.SetTargetProperty() 部分抛出某种错误,始终与 PropertyPath 相关。

我在这里尝试的东西有点不知所措,所以任何帮助将不胜感激。

WPF vb.net 动画 情节提要

评论

0赞 Clemens 9/22/2023
Timer.Interval = TimeSpan.FromMilliseconds(1)行不通。DispatcherTimer 无法以 1 kHz 的速率执行其滴答处理程序。尝试 20 毫秒左右的间隔。

答: 暂无答案