故事板更改属性但未反映在UI中

时间:2010-10-06 07:27:56

标签: c#-3.0 silverlight-3.0 windows-phone-7 dependency-properties storyboard

我按下按钮点击此方法。 MyObj是一个扩展的Control类型,具有两个属性CenterX和CenterY,后备dp为CenterXProperty和CenterYProperty。

播放动画时,MyObj的CenterX和CenterY属性正在改变,但我看不到对象的任何移动。

private void MoveMyObjectsWithAnimation(MyObj item, Point point)
    {
        Duration duration = new Duration(TimeSpan.FromSeconds(3));
        Storyboard sb = new Storyboard();
        sb.Duration = duration;

        DoubleAnimation da = new DoubleAnimation();
        da.Duration = duration;
        da.EasingFunction = new SineEase();
        DoubleAnimation da1 = new DoubleAnimation();
        da1.Duration = duration;
        da1.EasingFunction = new SineEase();




        Storyboard.SetTarget(da, item);
        Storyboard.SetTargetProperty(da, new PropertyPath(MyObj.CenterXProperty));

        da.From = item.CenterX;
        da.To = point.X;


        Storyboard.SetTarget(da1, item);
        Storyboard.SetTargetProperty(da1, new PropertyPath(MyObj.CenterYProperty));

        da1.From = item.CenterY;
        da1.To = point.Y;
        sb.Children.Add(da);
        sb.Children.Add(da1);
        sb.Begin();



    }

以下是在MyObj类中声明的属性系统。

      public double CenterX
    {
        get
        {

         return (double)GetValue(CenterXProperty)+25;
        }
        set
        {
            Canvas.SetLeft(this, value - 25);
            SetValue(CenterXProperty, value);
            OnPropertyChanged(new PropertyChangedEventArgs("CenterX"));
        }
    }
    public double CenterY
    {
        get
        {


            return (double)GetValue(CenterYProperty) + 25;
        }
        set
        {
            Canvas.SetTop(this, value - 25);
            SetValue(CenterYProperty, value);
            OnPropertyChanged(new PropertyChangedEventArgs("CenterY"));

        }
    }

    public static readonly DependencyProperty CenterXProperty =
        DependencyProperty.Register("CenterX", typeof(double), typeof(MyObj), null);

    public static readonly DependencyProperty CenterYProperty =
        DependencyProperty.Register("CenterY", typeof(double), typeof(MyObj), null);

我做错了什么?

1 个答案:

答案 0 :(得分:1)

这是一个艰难的问题,因为你的代码看起来是正确的。

问题实际上是在动画属性时未调用DP setter。您的属性设置器从未被命中。

您只能在属性更改中捕获回调。

这有效:

public double CenterX
{
    get { return (double)GetValue(CentreXProperty); }
    set { SetValue(CentreXProperty, value); }
}

// Using a DependencyProperty as the backing store for CentreX.  
// This enables animation, styling, binding, etc...
public static readonly DependencyProperty CentreXProperty =
    DependencyProperty.Register("CentreX",
                                typeof(double),
                                typeof(MyObj),
                                new PropertyMetadata(0.0,
                                    new PropertyChangedCallback(OnCentreXChanged)));

static void OnCentreXChanged(object sender, DependencyPropertyChangedEventArgs args)
{
    // Get reference to self
    MyObj source = (MyObj)sender;

    // Add Handling Code
    double newValue = (double)args.NewValue;

    Canvas.SetTop(source, newValue - 25);
}

只需复制您的CenterYProperty。

我建议你抓住SLDP代码段from here,并始终使用它来添加DP。 (它生成的代码中有一个拼写错误,但代码片段很容易修复)。