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

相關問題