【问题标题】:PointAnimation targeting custom UserControl propertyPointAnimation 定位自定义 UserControl 属性
【发布时间】:2015-05-14 23:46:30
【问题描述】:

我正在尝试为我创建的 UserControl 的位置设置动画。 我的问题与 MSDN 上提出的这个问题非常相似,遗憾的是没有答案。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/11ce8aaa-1059-4fe5-8f4d-0fa7978e6ff2/using-pointanimation-to-move-a-control?forum=wpf

总而言之,我创建了一个名为“Position”的 Point 类型依赖属性,用于指定 UserControl 在 UI 上的位置,并希望将 UserConrol 设置为动画到新位置。

我的问题是我相信的一种语法,我不确定以我的 UserControl 属性为目标的正确语法(在代码隐藏中)。

public class SubContainer : Control 
{ 
 public static readonly DependencyProperty PositionProperty; 

 static SubContainer() 
 { 
    DefaultStyleKeyProperty.OverrideMetadata(typeof(SubContainer), 
        new FrameworkPropertyMetadata(typeof(SubContainer))); 

    PositionProperty = DependencyProperty.Register( 
        "Position", 
        typeof(Point), 
        typeof(SubContainer), 
        new PropertyMetadata(new Point(0, 0))); 
 } 

 public Point Position 
 { 
    get { return (Point)GetValue(PositionProperty); } 
    set { SetValue(PositionProperty, value); } 
 } 

然后是我的动画:

        public void BoxTransition()
    {
        Point destination = new Point(70, 300);
        SubContainer box = (MainContent.Children[0] as Container).Children[0] as SubContainer;
        PointAnimation transition = new PointAnimation();
        TimeSpan timespan = TimeSpan.FromSeconds(2);

        this.RegisterName("Target", box.Position);
        Transition.From = box.Position;
        Transition.To = destination;
        Storyboard.SetTargetName(transition, "Target");
        Storyboard.SetTargetProperty(transition, new PropertyPath(box.Position));
        Storyboard bTransition = new Storyboard();
        bTransition.Children.Add(transition);
        bTransition.Begin();

    }

我收到以下错误:

对象“System.Windows.Point”不能用作 PropertyPath 的访问器参数。访问器参数必须是 DependencyProperty、PropertyInfo 或 PropertyDescriptor。

任何为我的控件设置动画的替代方法也将不胜感激!

【问题讨论】:

  • 显示您的代码以便我们为您提供帮助。没有它我们如何发现语法错误?
  • 好的,所以我想我越来越近了。据此:social.msdn.microsoft.com/Forums/vstudio/en-US/… 我需要定位属性的来源,而不是实例。
  • 所以这比我预期的要难,我现在的计划是在 xaml 中构建我的界面,然后使用 Expressions Blend 来尝试制作和故事板。

标签: c# wpf animation storyboard


【解决方案1】:

WPF 允许在没有 Storyboard 的情况下直接启动 UIElement 属性的动画。

您不需要比这更多的代码:

var transition = new PointAnimation
{
    To = new Point(70, 300),
    Duration = TimeSpan.FromSeconds(2)
};

box.BeginAnimation(SubContainer.PositionProperty, transition);

注意上面没有设置PointAnimation的From属性。这样动画将从Position 属性的当前值开始。


作为Position 属性的替代方法,您可以将SubContainer 控件放在Canvas 中

<Canvas>
    <local:SubContainer x:Name="box" Canvas.Left="0" Canvas.Top="0" .../>
</Canvas>

并为其Canvas.LeftCanvas.Top 属性设置动画:

var duration = TimeSpan.FromSeconds(2);
box.BeginAnimation(Canvas.LeftProperty,
    new DoubleAnimation { To = 70, Duration = duration });
box.BeginAnimation(Canvas.TopProperty,
    new DoubleAnimation { To = 300, Duration = duration });

【讨论】:

    【解决方案2】:

    好的,问题解决了。使用 Expression Blend 满足您的所有动画需求。结束;)

    【讨论】:

      猜你喜欢
      • 2010-12-04
      • 2012-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2014-08-18
      • 1970-01-01
      • 2016-12-23
      相关资源
      最近更新 更多