2017-07-18 112 views
2

我有一个问题,我创建了一个名为Tile的控件(比如Windows 10上的Tile)。 此贴片通过使用投影类来模拟旋转3D,就像Silverlight中的投影类一样。WPF PropertyPath上的自定义控件

我们有一个底部突起类是这样的:

abstract public class Projection 
    : FrameworkElement 
{ 
    static public readonly DependencyProperty RotationZProperty = DependencyProperty.Register(
      nameof(RotationZ), 
      typeof(double), 
      typeof(Projection), 
      new UIPropertyMetadata(0.0, OnRotationChanged)); 

    static public readonly DependencyProperty RotationYProperty = DependencyProperty.Register(
      nameof(RotationY), 
      typeof(double), 
      typeof(Projection), 
      new UIPropertyMetadata(0.0, OnRotationChanged)); 

    static public readonly DependencyProperty RotationXProperty = DependencyProperty.Register(
      nameof(RotationX), 
      typeof(double), 
      typeof(Projection), 
      new UIPropertyMetadata(0.0, OnRotationChanged)); 

public double RotationZ 
{ 
    get { return this.GetValue<double>(RotationZProperty); } 
    set { SetValue(RotationZProperty, value); } 
} 

public double RotationY 
{ 
    get { return this.GetValue<double>(RotationYProperty); } 
    set { SetValue(RotationYProperty, value); } 
} 

public double RotationX 
{ 
    get { return this.GetValue<double>(RotationXProperty); } 
    set { SetValue(RotationXProperty, value); } 
} 

public FrameworkElement Child 
{ 
    get; 
    set; 
} 

static private void OnRotationChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
     { 
      if (d is Projection pl) 
      { 
       pl.OnRotationChanged(); 
      } 
     } 

     private void OnRotationChanged() 
     { 
      // Some code 
     }} 

After that, we have the PlaneProjectionClass : 

    [ContentProperty("Child")] 
    sealed public class PlaneProjection 
     : Projection 
    { 
    } 

磁砖类中使用投影类型依赖属性:

 public class Tile 
    { 
    static public readonly DependencyProperty PlaneProjectionProperty = DependencyProperty.Register(
      nameof(Projection), 
      typeof(Projection), 
      typeof(Tile), 
      new UIPropertyMetadata()); 

public Projection Projection 
     { 
      get { return (Projection)GetValue(PlaneProjectionProperty); } 
      private set { SetValue(PlaneProjectionProperty, value); } 
     } 

     override public void OnApplyTemplate() 
     { 
      Projection = GetTemplateChild("PART_Projection") as Projection; 
     } 
    } 

所以对于XAML,我们有这样的控件模板:

<controls:PlaneProjection x:Name="PART_PlaneProjection"> 
    <Border> 
    <Grid> 
     <!-- Some design --> 
    </Grid> 
    </Border> 
</controls:PlaneProjection> 

现在我想动画飞机投影。

所以我创建故事板和动画处理的的rotationX投影:

static public void CreateAnimation(Tile tile) 
{ 
    Storyboard.SetTarget(anim, tile); 
    Storyboard.SetTargetProperty(doubleAnim, new PropertyPath("(Tile.Projection).(PlaneProjection.RotationX")); 
} 

但在调试,我有这样的错误:无法解析属性的路径上的财产的所有引用“(Tile.Projection )。(PlaneProjection.RotationX)

我不明白的错误:(上自定义控件使用的PropertyPath任何想法?

回答

2

类平铺Projection属性不遵循依赖公关的命名约定operties。

它应该例如是这样的:

public static readonly DependencyProperty PlaneProjectionProperty = 
    DependencyProperty.Register(nameof(PlaneProjection), typeof(Projection), typeof(Tile)); 

public Projection PlaneProjection 
{ 
    get { return (Projection)GetValue(PlaneProjectionProperty); } 
    private set { SetValue(PlaneProjectionProperty, value); } 
} 

属性路径将仅仅是这样的:

Storyboard.SetTargetProperty(anim, new PropertyPath("PlaneProjection.RotationX")); 

你甚至不需要一个故事板。只需拨打

tile.PlaneProjection.BeginAnimation(Projection.RotationXProperty, anim); 

作为一个说明,一个私人二传手不会使依赖属性为只读。详情请参阅Read-Only Dependency Properties