C# 新属性元数据(0.0,OnAngleChanged)与新属性元数据(0,OnAngleChanged)

C# 新属性元数据(0.0,OnAngleChanged)与新属性元数据(0,OnAngleChanged),c#,wpf,C#,Wpf,下面是CSharp代码,我想使用附加的属性Angle在我的XAML中更改矩形的角度。问题是,当我将新属性元数据(0.0,OnAngleChanged)更改为新属性元数据(0,OnAngleChanged)时,它不工作,抛出XamlParseException,并说XXX.RotationManager的类型初始值设定项抛出了一个异常。我想知道为什么新的PropertyMetadata(0,OnAngleChanged)不起作用 class RotationManager { public

下面是CSharp代码,我想使用附加的属性
Angle
在我的XAML中更改矩形的角度。问题是,当我将
新属性元数据(0.0,OnAngleChanged)
更改为
新属性元数据(0,OnAngleChanged)
时,它不工作,抛出
XamlParseException
,并说XXX.RotationManager的类型初始值设定项抛出了一个异常。我想知道为什么
新的PropertyMetadata(0,OnAngleChanged)
不起作用

class RotationManager
{
    public static double GetAngle(DependencyObject obj)
    {
        return (double)obj.GetValue(AngleProperty);
    }

    public static void SetAngle(DependencyObject obj, double value)
    {
        obj.SetValue(AngleProperty, value);
    }

    // Using a DependencyProperty as the backing store for Angle.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty AngleProperty =
        DependencyProperty.RegisterAttached("Angle", typeof(double), typeof(RotationManager), new PropertyMetadata(0.0,OnAngleChanged));

    private static void OnAngleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var element = d as UIElement;
        if (element!=null)
        {
            element.RenderTransformOrigin = new Point(.5, .5);
            element.RenderTransform = new System.Windows.Media.RotateTransform((double)e.NewValue);
        }
    }
}

由于
PropertyMetaData()
的第一个参数的类型与
GetAngle
SetAngle
相同,当您将
GetAngle
SetAngle
的类型更改为
int
时,
新的PropertyMetaData(0,OnAngleChanged)
可以工作


但是,将属性类型更改为
int
是不可行的。它的类型应与以后分配给它的属性相同,即
RotateTransform.Angle
,即
double

最好的解决方案是根本不指定默认值,因此隐式地将
0.0
default(double)
作为默认值:

public static readonly DependencyProperty AngleProperty =
    DependencyProperty.RegisterAttached(
        "Angle", typeof(double), typeof(RotationManager),
        new PropertyMetadata(new PropertyChangedCallback(OnAngleChanged)));

PropertyMetadata第一个构造函数参数的类型为object。如果您只写0,那么它将被解释为int类型并被装箱。请尝试使用新的PropertyMetadata((double)0,…)来声明您想要一个双值。非常感谢,它确实解决了我的问题!我尝试了你的方法,这比鲁福爵士的回答要好改变财产类型是错误的方法。角度应该用浮点类型表示,通常为
double