在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中的设计时间自定义控件。如前所述,我无法扩展其他属性似乎很奇怪。
非常感谢您对此的帮助!谢谢。 :)
答案 0 :(得分:3)
FrameworkPropertyMetadata
无法为属性的默认值强制使用正确的类型,这意味着您需要确保提供所需的完全类型。 e.g。
DependencyProperty.Register
(
"Thickness",
typeof(double),
typeof(LineTypeViewer),
new FrameworkPropertyMetadata(1, OnPropertyChanged)
);
在这里,您向int
属性提供double
。您需要将1
更改为1.0
或将其(double)1
投射。
这可能是也可能不是崩溃的原因,但它应该会导致运行时错误。