故事板更改属性,但没有反映在UI
问题描述:
我有这个方法点击按钮时触发。 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);
我在做什么错?
答
这是一个艰难的,因为你的代码看起来是正确的。
问题实际上是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
OnPropertyChanged在依赖属性上是多余的。 SetValue在幕后进行。拿出这些电话给初学者。 – 2010-10-06 13:41:42