0

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>
4

2 に答える 2

1

あなたのアプローチの問題は、Click ハンドラーを繰り返し呼び出して UI スレッドをブロックしていることです。SleepWPF は、あなたがしようとしていることに対して非常に洗練されたメカニズムを提供します。それはアニメーションと呼ばれます。

a の回転をアニメーション化するメソッドはFrameworkElement、C# では次のようになります (申し訳ありませんが、私は VB を話せません)。

private void RotateElement(
    FrameworkElement element, double from, double to, TimeSpan duration)
{
    var transform = element.RenderTransform as RotateTransform;
    if (transform != null)
    {
        var animation = new DoubleAnimation(from, to, duration);
        transform.BeginAnimation(RotateTransform.AngleProperty, animation);
    }
}

は、 のプロパティにRotateTransform既に含まれている必要があることに注意してください。たとえば、次のように XAML で割り当てることができます。RenderTransformFrameworkElement

<Image RenderTransformOrigin="0.5,0.5" ...>
    <Image.RenderTransform>
        <RotateTransform/>
    </Image.RenderTransform>
</Image>

RotateElement次のように、ボタン クリック ハンドラーでメソッドを呼び出します。

private void btnSpin_Click(object sender, RoutedEventArgs e)
{
    RotateElement(Image1, 0, 360, TimeSpan.FromMilliseconds(360 * 50));
}

また、毎回Slider1_ValueChanged新しいものを作成する必要もないことにも注意してください。RotateTransform

さらに、 のように を呼び出す必要はほとんどありませInvalidateVisualspinWheel

于 2013-02-08T08:47:55.117 に答える
0

クレメンスの答えは良いです。アニメーションを一時停止/再開できるのは、コード ビハインドで作成した場合のみであることを忘れないでください。私の記憶が正しければ、アニメーションを XAML で開始すると制御できません。

于 2013-02-09T12:34:07.407 に答える