0

我有这个方法点击按钮时触发。 MyObj是一个扩展的控件类型,具有两个属性CenterX和CenterY,并具有支持dp CenterXProperty和CenterYProperty的属性。故事板更改属性,但没有反映在UI

随着动画播放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); 

我在做什么错?

+0

OnPropertyChanged在依赖属性上是多余的。 SetValue在幕后进行。拿出这些电话给初学者。 – 2010-10-06 13:41:42

回答

1

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

问题实际上是DP属性被动画时没有被调用。你的物业二传手从未被击中。

您只能捕捉属性更改的回调。

这工作:

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。 (在它生成的代码中有一个错字,但它易于修复的片段)。

+0

感谢HiTech..That是我的问题的正确解决方案..感谢指向我SLDP片段。 – async 2010-10-07 05:44:26

相关问题