2017-06-03 3 views
0

に従ってください。CSHarpコードに従ってください。付属のプロパティAngleを使用して、XAMLの四角形の角度を変更します。問題は、私がnew PropertyMetadata(0.0,OnAngleChanged)new PropertyMetadata(0,OnAngleChanged)に変更したときにうまく動作せず、XamlParseExceptionを投げて、the type initializer for XXX.RotationManager threw an exceptionと言います。私はなぜnew PropertyMetadata(0,OnAngleChanged)がうまくいかないのだろうか。新しいPropertyMetadata(0.0、OnAngleChanged)と新しい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); 
     } 
    } 
} 
+2

PropertyMetadata最初のコンストラクタの引数はObject型です。 0だけを書くと、int型として解釈され、ボックス化されます。新しい値をPropertyMetadata((double)0、...)を使ってdouble値を指定してみてください –

+0

本当にありがとうございました。 – Grey

答えて

1

PropertyMetaData()の最初のパラメータは、あなたがintGetAngleSetAngleの種類を変更する場合、GetAngleSetAngleと同じタイプで、new 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))); 
+0

あなたの方法を試してみてください、それはRufoの答えより良い答えです – Grey

+0

プロパティの種類を変更するのは間違っています。角度は浮動小数点型(通常は 'double')で表されるべきです。 – Clemens