DependencyProperty导致Visual Studio在设计时崩溃

时间:2014-07-17 21:20:30

标签: c# wpf visual-studio crash dependency-properties

在Visual Studio中,当尝试通过设计模式查看自定义控件的属性时,Visual Studio会在看到属性之前崩溃。

自从将依赖属性实现到我的控件中以来,这一变化已经开始。

为什么会发生这种情况(或导致这种情况的原因)?正确设置依赖项属性需要什么?

注意:自定义控件位于单独的.DLL中,我无法将Visual Studio配置为在工具箱中显示我的自定义控件。但是,Visual Studio知道控件存在,因为它在手动键入XAML时显示为建议。

另请注意,我可以查看默认的公共属性。当我展开其他属性时会发生此问题。

以下是我设置的依赖项属性:

public static readonly DependencyProperty ThicknessProperty =
    DependencyProperty.Register("Thickness", typeof(double), typeof(LineTypeViewer), new FrameworkPropertyMetadata(1, OnPropertyChanged));

public static readonly DependencyProperty ForegroundProperty =
    DependencyProperty.Register("Foreground", typeof(SolidColorBrush), typeof(LineTypeViewer), new FrameworkPropertyMetadata(Brushes.Black, OnPropertyChanged));

public static readonly DependencyProperty CurrentLineTypeProperty =
    DependencyProperty.Register("CurrentLineType", typeof(LineType), typeof(LineTypeViewer), new FrameworkPropertyMetadata(null, OnPropertyChanged));

public static readonly DependencyProperty DrawingWidthProperty =
    DependencyProperty.Register("DrawingWidth", typeof(float), typeof(LineTypeViewer), new FrameworkPropertyMetadata(5, OnPropertyChanged, OnCoerceDrawingWidthProperty));

public static readonly DependencyProperty MinRepetitionsProperty =
    DependencyProperty.Register("MinRepetitions", typeof(int), typeof(LineTypeViewer), new FrameworkPropertyMetadata(3, OnPropertyChanged));

另外......因为它与上述属性中描述的元数据有关,以下是我使用的回调函数:

private static void OnPropertyChanged(DependencyObject source, DependencyPropertyChangedEventArgs e)
{   //Update the layout when any of the above properties are changed.
    LineTypeViewer viewer = (LineTypeViewer)source;
    viewer.UpdateLayout();
}

private static object OnCoerceDrawingWidthProperty(DependencyObject source, object data)
{
    if (data is float) //The DrawingWidth must be a float.
    {
        float dw = (float)data;
        if (dw < 0) return 5; //The DrawingWidth cannot be negative.
        else return dw;
    }
    else return 5;
}

以下是所有包装器属性:

public double Thickness
{
    get { return (double)GetValue(ThicknessProperty); }
    set { SetValue(ThicknessProperty, value); }
}
public SolidColorBrush Foreground
{
    get { return GetValue(ForegroundProperty) as SolidColorBrush; }
    set { SetValue(ForegroundProperty, value); }
}
public LineType CurrentLineType
{
    get { return GetValue(CurrentLineTypeProperty) as LineType; }
    set { SetValue(CurrentLineTypeProperty, value); }
}
public float DrawingWidth
{
    get { return (float)GetValue(DrawingWidthProperty); }
    set { SetValue(DrawingWidthProperty, value); }
}
public int MinRepetitions
{
    get { return (int)GetValue(MinRepetitionsProperty); }
    set { SetValue(MinRepetitionsProperty, value); }
}  

根据我一直在使用(MDSN&amp; WPF Tutorial)的指南,我的代码看起来是正确的,所以也许它不是依赖性的问题属性。我怀疑是因为依赖属性允许您通过Visual Studio中的设计时间自定义控件。如前所述,我无法扩展其他属性似乎很奇怪。

非常感谢您对此的帮助!谢谢。 :)

1 个答案:

答案 0 :(得分:3)

FrameworkPropertyMetadata无法为属性的默认值强制使用正确的类型,这意味着您需要确保提供所需的完全类型。 e.g。

DependencyProperty.Register
(
    "Thickness",
    typeof(double),
    typeof(LineTypeViewer),
    new FrameworkPropertyMetadata(1, OnPropertyChanged)
);

在这里,您向int属性提供double。您需要将1更改为1.0或将其(double)1投射。

这可能是也可能不是崩溃的原因,但它应该会导致运行时错误。