0

私はこのような楕円を持っています:

<Ellipse Width="40" Height="50" Fill="Green">
        <Ellipse.RenderTransform>
            <RotateTransform Angle="0" CenterX="20" CenterY="25" />
        </Ellipse.RenderTransform>
        <Ellipse.Triggers>
            <EventTrigger RoutedEvent="Ellipse.Loaded" >
                        <BeginStoryboard>
                            <Storyboard>
                                <DoubleAnimation Storyboard.TargetProperty="RenderTransform.Angle"
                    From="0" To="360" Duration="{Binding Path=Dudu}" RepeatBehavior="Forever" />
                            </Storyboard>
                        </BeginStoryboard>
            </EventTrigger>
        </Ellipse.Triggers>
    </Ellipse>

プロパティに応じて楕円を速度で回転させたいDudu(このプロパティはINotifyPropertyChanged変更を通知するために使用されます)。

ただし、の値を変更しても期間は変更されませんDudu。問題はLoaded、初めてコントロールがロードされたときに発生するイベントだけであることがわかりました。

私の質問は: プロパティの値を変更して期間を変更するにはどうすればよいですか? どのイベントを使用すればよいですか?

4

1 に答える 1

2

Dudu保税物件自体に問題があるのではないかと思います。適切に解決され、正しいタイプであるかどうかを確認します

上記が機能しない場合、代替ソリューションを作成しようとしました

これは、添付された動作を使用したサンプルです

<Ellipse Width="40"
         Height="50"
         Fill="Green"
         xmlns:l="clr-namespace:CSharpWPF"
         l:AnimationHelper.AnimationDuration="0:0:2">
    <Ellipse.RenderTransform>
        <RotateTransform Angle="0"
                         CenterX="20"
                         CenterY="25" />
    </Ellipse.RenderTransform>
</Ellipse>

AnimationHelper.AnimationDuration="0:0:2"ストーリーボードでトリガーを削除し、バインドできるプロパティを添付したことに注意してくださいAnimationHelper.AnimationDuration="{Binding Path=Dudu}"

AnimationHelper クラス

namespace CSharpWPF
{
    public class AnimationHelper : DependencyObject
    {
        public static Duration GetAnimationDuration(DependencyObject obj)
        {
            return (Duration)obj.GetValue(AnimationDurationProperty);
        }

        public static void SetAnimationDuration(DependencyObject obj, Duration value)
        {
            obj.SetValue(AnimationDurationProperty, value);
        }

        // Using a DependencyProperty as the backing store for AnimationDuration.
        // This enables animation, styling, binding, etc...
        public static readonly DependencyProperty AnimationDurationProperty =
            DependencyProperty.RegisterAttached("AnimationDuration", typeof(Duration),
            typeof(AnimationHelper), new PropertyMetadata(Duration.Automatic,
            OnAnimationDurationChanged));

        private static void OnAnimationDurationChanged(DependencyObject d,
            DependencyPropertyChangedEventArgs e)
        {
            FrameworkElement element = d as FrameworkElement;
            element.Loaded += (s, arg) => element.RenderTransform.BeginAnimation(
                RotateTransform.AngleProperty,
                new DoubleAnimation(0, 360, (Duration)e.NewValue)
                { RepeatBehavior = RepeatBehavior.Forever });
        }
    }
}

上記の例では、RenderTransform プロパティでハードコーディングされた DoubleAnimation を使用していることにも注意してください。RenderTransform が RotateTransform のインスタンスで初期化されていると仮定します。必要に応じて動作を拡張して動的にすることもできます。

于 2014-08-11T05:42:25.213 に答える