7

基本的には、たくさんのシェイプを作成してアニメーション化したいと考えています。そこで、次のカスタムクラスを思いつきました:

public class FunkyShape : DependencyObject
{
    public double Animator
    {
        get { return (double)GetValue(AnimatorProperty); }
        set { SetValue(AnimatorProperty, value); }
    }

    public static readonly DependencyProperty AnimatorProperty =
        DependencyProperty.Register("Animator", typeof(double), typeof(FunkyShape), 
        new PropertyMetadata(0, new PropertyChangedCallback(Animator_Changed)));

    private static void Animator_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        double delta = (double)e.NewValue - (double)e.OldValue;

        ((FunkyShape)d).ProcessDelta((double)e.NewValue, delta);
    }

    private void ProcessDelta(double val, double delta)
    {
        Holder.Width = val;
        Holder.Height = val;

        // Keep shape centered
        HolderPosition.X = delta / 2;
        HolderPosition.Y = delta / 2;
    }

    private Shape Holder;
    public TranslateTransform HolderPosition
    {
        get { return (TranslateTransform)Holder.RenderTransform; }
    }


    public FunkyShape(Canvas playground, Shape shapeToInit)
    {
        Holder = shapeToInit;

        Holder.Width = 10;
        Holder.Height = 10;
        Holder.Fill = new SolidColorBrush(Colors.Blue);
        Holder.HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Center;
        Holder.RenderTransform = new TranslateTransform()
        {
            X = 500,
            Y = 500
        };
        Holder.RenderTransformOrigin = new Point(0.5, 0.5);

        // init done
        playground.Children.Add(Holder);

        Animate();
    }

    public void Animate()
    {
        DoubleAnimation g1 = GrowAnimation();

        Storyboard sb = new Storyboard();
        Storyboard.SetTarget(g1, this);

        // CAN'T FIND ANIMATOR PROPERTY
        Storyboard.SetTargetProperty(g1, "Animator");

        sb.Children.Add(g1);

        sb.Begin(); // THROWS EXCEPTION
    }

    private static DoubleAnimation GrowAnimation()
    {
        DoubleAnimation growAnimation = new DoubleAnimation();
        growAnimation.Duration = TimeSpan.FromMilliseconds(3000);
        growAnimation.From = 0;
        growAnimation.To = 100;
        growAnimation.AutoReverse = true;
        growAnimation.EnableDependentAnimation = true;
        growAnimation.RepeatBehavior = new RepeatBehavior(5);
        return growAnimation;
    }
}

ただし、クラスのインスタンスを作成してキャンバスに追加しようとすると、Storyboard.Being() が例外をスローし、Animator プロパティが見つからないことがわかります。

それで - 私は何を間違っていますか?

編集: 3 つのコード変更後 - まだ機能していません。「指定されたオブジェクトの TargetProperty Animator を解決できません」というエラーが表示されます。誰かが答えを知っている場合は、コードを変更して助けてください。ありがとう!

編集: OK、頭を壁にぶつけてから 24 時間後、いくらかの進歩があります。理由がわかるかどうか見てみましょう。

4

4 に答える 4

6

わかった、

フレームワーク内の明らかにバグであるものの回避策を見つけました(ただし、一部のMS従業員が応答を投稿し、それが機能/設計によるものであると言うでしょう)。いくつかのことを行う必要があります。

  1. デフォルト/パラメータなしのコンストラクタを追加
  2. FunkyShape の基本クラスを UserControl に変更します。
  3. 図形を追加する Page クラスの XAML ビューを開きます
  4. Canvas XAML 内に FunkyShape の 1 つのインスタンスを子として追加します (<tm:FunkyShape /> など)。これなしでは機能しません。
  5. コード ビハインドで FunkyShape のインスタンスを作成し、それをキャンバスに追加し、アニメーションを開始して動作を確認します
  6. バグの少ないテクノロジーに切り替えます。
于 2012-10-16T22:18:19.730 に答える
3

Windows 8 では、enabledependentanimation プロパティを true に設定しないと、カスタム プロパティをアニメーション化できません。これは、非決定論的アニメーションがデフォルトで無効になっているためです。

参照: http://msdn.microsoft.com/en-us/library/windows/apps/windows.ui.xaml.media.animation.pointanimation.enabledependentanimation.aspx

于 2012-10-16T17:15:22.300 に答える
1

はい、このプロパティを通常の CLR プロパティだけでなく、依存関係プロパティとして定義する必要があります。これには、かなりの単純な定型コードが含まれます。完全な例については、ブログ投稿を参照してください。

http://timheuer.com/blog/archive/2012/03/07/creating-custom-controls-for-metro-style-apps.aspx

于 2012-10-15T07:03:11.713 に答える