提问人:Trodgy 提问时间:9/22/2023 最后编辑:Trodgy 更新时间:9/22/2023 访问量:32
无法对 WPF 中图像的位置进行动画处理
Unable to animate the position of an image in a WPF
问:
好的,所以我有一个由默认窗口的.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 相关。
我在这里尝试的东西有点不知所措,所以任何帮助将不胜感激。
答: 暂无答案
评论
Timer.Interval = TimeSpan.FromMilliseconds(1)
行不通。DispatcherTimer 无法以 1 kHz 的速率执行其滴答处理程序。尝试 20 毫秒左右的间隔。