1

から派生したクラスがありFrameworkElement、WPF で を使用してその Location プロパティを更新する必要がありますDoubleAnimation。プロパティを次のように登録しますDependendencyProperty

public class TimeCursor : FrameworkElement
{
    public static readonly DependencyProperty LocationProperty;

    public double Location
    {
        get { return (double)GetValue(LocationProperty); }
        set
        {
            SetValue(LocationProperty, value);
        }
    }

    static TimeCursor()
    {
        LocationProperty = DependencyProperty.Register("Location", typeof(double), typeof(TimeCursor));
    }
}

次のコードは、ストーリーボードを設定します。

TimeCursor timeCursor;
private void SetCursorAnimation()
{
    timeCursor = new TimeCursor();
    NameScope.SetNameScope(this, new NameScope());
    RegisterName("TimeCursor", timeCursor);

    storyboard.Children.Clear();

    DoubleAnimation animation = new DoubleAnimation(LeftOffset, LeftOffset + (VerticalLineCount - 1) * HorizontalGap + VerticalLineThickness, 
                new Duration(TimeSpan.FromMilliseconds(musicDuration)), FillBehavior.HoldEnd);

    Storyboard.SetTargetName(animation, "TimeCursor");
    Storyboard.SetTargetProperty(animation, new PropertyPath(TimeCursor.LocationProperty));

    storyboard.Children.Add(animation);
}

storyboard.Begin(this)次に、上記のメソッドを含むオブジェクトの別のメソッドから呼び出します。SetCursorAnimation()このオブジェクトは から派生していCanvasます。ただし、Locationプロパティが更新されることはなく (Location の set アクセサーが呼び出されることはありません)、例外はスローされません。私は何を間違っていますか?

4

1 に答える 1

1

依存関係プロパティがアニメーション化されると(またはXAMLで設定されるか、スタイルセッターによって設定されるなど)、WPFはCLRラッパーを呼び出さず、代わりに基になるDependencyObjectオブジェクトとDependencyPropertyオブジェクトに直接アクセスします。依存関係プロパティを定義するためのチェックリストの「ラッパー」セクションの実装と、カスタム依存関係プロパティへの影響を参照してください。

プロパティの変更に関する通知を受け取るには、PropertyChangedCallbackを登録する必要があります。

public class TimeCursor : FrameworkElement
{
    public static readonly DependencyProperty LocationProperty =
        DependencyProperty.Register(
            "Location", typeof(double), typeof(TimeCursor),
            new FrameworkPropertyMetadata(LocationPropertyChanged)); // register callback here

    public double Location
    {
        get { return (double)GetValue(LocationProperty); }
        set { SetValue(LocationProperty, value); }
    }

    private static void LocationPropertyChanged(
        DependencyObject obj, DependencyPropertyChangedEventArgs e)
    {
        var timeCursor = obj as TimeCursor;

        // handle Location property changes here
        ...
    }
}

また、依存関係プロパティのアニメーション化には必ずしもストーリーボードが必要ではないことにも注意してください。TimeCursorインスタンスでBeginAnimationメソッドを呼び出すだけです。

var animation = new DoubleAnimation(LeftOffset,
    LeftOffset + (VerticalLineCount - 1) * HorizontalGap + VerticalLineThickness, 
    new Duration(TimeSpan.FromMilliseconds(musicDuration)),
    FillBehavior.HoldEnd);

timeCursor.BeginAnimation(TimeCursor.LocationProperty, animation);
于 2013-01-05T17:12:28.607 に答える