Почему реализация свойства зависимости приведет к сбою моего приложения, если я предоставлю значение по умолчанию?

Почему реализация свойства зависимости приведет к сбою моего приложения, если я предоставлю значение по умолчанию?

Этот сегмент кода находится в объявлении класса для моего объекта UserControl. Все работает нормально - компилируется и работает отлично.

public static System.Windows.DependencyProperty DepProp
    = System.Windows.DependencyProperty.Register(   "Rect",
                                                    typeof(System.Windows.Shapes.Rectangle),
                                                    typeof(FooControl));
public System.Windows.Shapes.Rectangle Rect
{
    get
    { return ((System.Windows.Shapes.Rectangle)(GetValue(DepProp))); }
    set
    { SetValue(DepProp, value); }
}

Однако, когда я добавляю значение по умолчанию к свойству зависимости:
Код компилируется, но вылетает с фатальным исключением при попытке создать экземпляр UserControl.

Для справки, мой код теперь выглядит так - с добавленной строкой PropertyMetaData:

public static System.Windows.DependencyProperty DepProp
    = System.Windows.DependencyProperty.Register(   "Rect",
                                                    typeof(System.Windows.Shapes.Rectangle),
                                                    typeof(FooControl),
                                                    new System.Windows.PropertyMetadata(new System.Windows.Shapes.Rectangle()));
public System.Windows.Shapes.Rectangle Rect
{
    get
    { return ((System.Windows.Shapes.Rectangle)(GetValue(DepProp))); }
    set
    { SetValue(DepProp, value); }
}  

Удаление PropertyMetadata из вызова Register () приводит к тому, что программа работает отлично, без сбоев или каких-либо других проблем. Но мне нужно значение по умолчанию для более позднего кода. Как я могу заставить его принять значение по умолчанию без сбоев?

При сбое в окне вывода отображаются следующие исключения:

A first chance exception of type 'System.ArgumentException' occurred in WindowsBase.dll  
A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll  
A first chance exception of type 'System.Windows.Markup.XamlParseException' occurred in PresentationFramework.dll  

Мне нужно, чтобы это заработало как можно скорее, поэтому любой совет будет потрясающим!


person Giffyguy    schedule 22.07.2009    source источник
comment
Если бы у вас была трассировка стека, это было бы чрезвычайно полезно.   -  person Anderson Imes    schedule 23.07.2009
comment
Действительно? Я понятия не имел, что это связано. Дай-ка посмотреть, что я могу придумать ... Возможно, я какое-то время не дойду до этого - занят чем-то неотложным.   -  person Giffyguy    schedule 23.07.2009


Ответы (1)


Короткий ответ:

Значения по умолчанию для свойств зависимостей должны быть потокобезопасными (например, наследоваться от System.Windows.Freezable), а System.Windows.Forms.Rectangle - нет.

Длинный ответ:

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/2cb12481-ef86-40b7-8333-443598d89933/

Намекать:

Если вы используете Visual Studio, это действительно помогает позволить IDE прерываться при каждом генерировании исключения. Просто перейдите в «Отладка» -> «Исключения» и отметьте «Исключения среды CLR» «Выброшены».

Затем вам будет предложено и появится сообщение об исключении, которое в вашем случае выглядит следующим образом: «Дополнительная информация: значение по умолчанию для свойства Rect не может быть привязано к определенному потоку».

person Christian Birkl    schedule 24.07.2009