WPF映像仅在最后一帧的运行时更新

WPF映像仅在最后一帧的运行时更新,wpf,vb.net,xaml,Wpf,Vb.net,Xaml,我是XAML的新手。我编写了以下例程,将图像旋转给定角度(0到360)。我加入了一个滑块控件,根据滑块值设置角度。很好!但是,当运行程序并单击“旋转”按钮时,For/Next循环从0变为360,图像将仅显示最后一次角度旋转(360)。我确实输入了一个Sleep命令来减慢速度,以防我没有捕捉到以前的更新。如果您有任何关于它为什么不会持续更新的帮助,我们将不胜感激。多谢各位 Imports System.Threading.Thread Imports System.Windows.Media.Im

我是XAML的新手。我编写了以下例程,将图像旋转给定角度(0到360)。我加入了一个滑块控件,根据滑块值设置角度。很好!但是,当运行程序并单击“旋转”按钮时,For/Next循环从0变为360,图像将仅显示最后一次角度旋转(360)。我确实输入了一个Sleep命令来减慢速度,以防我没有捕捉到以前的更新。如果您有任何关于它为什么不会持续更新的帮助,我们将不胜感激。多谢各位

Imports System.Threading.Thread
Imports System.Windows.Media.Imaging.BitmapImage

Class MainWindow

    Private Sub Slider1_ValueChanged(sender As System.Object, e As System.Windows.RoutedPropertyChangedEventArgs(Of System.Double)) Handles Slider1.ValueChanged
' ---- when I adjust manually, this works perfectly
        Dim rotateTransform1 As New RotateTransform
        rotateTransform1.Angle = Slider1.Value
        lblAngle.Content = rotateTransform1.Angle
        Image1.RenderTransform = rotateTransform1
    End Sub

    Private Sub btnSpin_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnSpin.Click
    Dim spinAngle as Double
    For SpinAngle 0 to 360
            spinWheel(spinAngle)
            Sleep(50)
        Next spinAngle
    End Sub

    Private Sub spinWheel(ByVal spinAngle)
        Dim rotateTransform1 As New RotateTransform
        rotateTransform1.Angle = SpinAngle 'Slider1.Value
       Image1.RenderTransform = rotateTransform1
        lblAngle.Content = rotateTransform1.Angle
        Image1.InvalidateVisual()

    End Sub

    Public Sub New()

        ' This call is required by the designer.
        InitializeComponent()

        ' Add any initialization after the InitializeComponent() call.
        ' Image1.createOption = BitmapCreateOptions.IgnoreImageCache

    End Sub

End Class

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="677" Width="910">
    <Grid Background="#FF006903">
        <Grid.RowDefinitions>
            <RowDefinition Height="238*" />
            <RowDefinition Height="178*" />
        </Grid.RowDefinitions>
        <Button Content="SPIN!" Height="23" HorizontalAlignment="Left" Margin="521,101,0,0" Name="btnSpin" VerticalAlignment="Top" Width="75" Grid.Row="1" FontFamily="Tahoma" FontSize="15" FontWeight="ExtraBold" />
        <Image Height="615" Margin="32,7,0,0" Name="Image1" Stretch="None" VerticalAlignment="Top"
               RenderTransformOrigin=" 0.5,0.5"    Source="/rotatePicture;component/Images/purp_wheel_cropped.png"
               Grid.RowSpan="2" HorizontalAlignment="Left" Width="619" />

        <Slider Height="25" HorizontalAlignment="Left" Margin="127,188,0,0" Name="Slider1" VerticalAlignment="Top" Width="350" Maximum="360" Grid.Row="1" />
        <Label Content="Label" Height="28" HorizontalAlignment="Left" Margin="521,175,0,0" Name="lblAngle" VerticalAlignment="Top" Width="75" Grid.Row="1" FontFamily="Tahoma" FontSize="15" FontWeight="ExtraBold" />
        <Image Height="29" HorizontalAlignment="Left" Margin="535,252,0,0" Name="Image2" Stretch="Fill" VerticalAlignment="Top" Width="55" Source="/rotatePicture;component/Images/wheel_pointer.png" />
    </Grid>
</Window>
导入System.Threading.Thread
导入System.Windows.Media.Imaging.BitmapImage
类主窗口
私有子Slider1_值已更改(发件人作为System.Object,e作为System.Windows.RoutedPropertyChangedEventArgs(属于System.Double))处理Slider1.ValueChanged
'----当我手动调整时,它工作得非常好
将rotateTransform1调整为新的RotateTransform
rotateTransform1.角度=滑块1.值
lblAngle.Content=rotateTransform1.Angle
Image1.RenderTransform=rotateTransform1
端接头
私有子btnSpin\u单击(发件人作为System.Object,e作为System.Windows.RoutedEventArgs)处理btnSpin。单击
双色暗菠菜角
对于Spingle 0到360
纺车
睡眠(50)
下一个菠菜角
端接头
专用子旋转轮(ByVal Spingle)
将rotateTransform1调整为新的RotateTransform
rotateTransform1.角度=SpinAngle'滑块1.值
Image1.RenderTransform=rotateTransform1
lblAngle.Content=rotateTransform1.Angle
图1.InvalidateVisual()
端接头
公共分新()
'设计器需要此调用。
初始化组件()
'在InitializeComponent()调用之后添加任何初始化。
'Image1.createOption=BitmapCreateOptions.IgnoreImageCache
端接头
末级
XAML

您的方法的问题是,您在单击处理程序中反复调用
Sleep
,从而阻塞了UI线程。WPF为您尝试执行的操作提供了一种非常优雅的机制。它叫

FrameworkElement
的旋转设置动画的方法可能如下所示(抱歉,我不会说VB)

请注意,
RotateTransform
必须已经包含在
FrameworkElement
RenderTransform
属性中。例如,可以在XAML中分配它,如下所示:

<Image RenderTransformOrigin="0.5,0.5" ...>
    <Image.RenderTransform>
        <RotateTransform/>
    </Image.RenderTransform>
</Image>
private void btnSpin_Click(object sender, RoutedEventArgs e)
{
    RotateElement(Image1, 0, 360, TimeSpan.FromMilliseconds(360 * 50));
}

还请注意,在
幻灯片1\u ValueChanged
中,也不必每次都创建新的
旋转变换


此外,几乎不需要调用
InvalidateVisual
,就像您在
spinWheel
中所做的那样。克莱门斯的回答很好。不要忘记,只有在代码隐藏中创建动画时,才能暂停/恢复动画。如果我没记错的话,如果在XAML中启动动画,则无法控制动画。

完全可能是因为睡眠时间太短。你试过多高?说“另一个答案是好的”本身并不是问题的答案。如果你觉得关于动画还有更多的话要说的话,你可以将此作为对我答案的评论。我没有足够的特权这样做。也许首先允许新用户发表评论@请考虑接受答案。看看它是如何工作的。
private void btnSpin_Click(object sender, RoutedEventArgs e)
{
    RotateElement(Image1, 0, 360, TimeSpan.FromMilliseconds(360 * 50));
}