2009-07-22 10 views
7

Dlaczego implementacja właściwości zależności powoduje awarię aplikacji po podaniu domyślnej wartości?Dlaczego implementacja właściwości Dependency-Property powoduje zawieszenie aplikacji, gdy dostarczę wartość domyślną?

Ten segment kodu znajduje się w deklaracji klasy dla mojego obiektu UserControl. Wszystko działa dobrze - kompiluje się i działa idealnie.

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); } 
} 

Jednak kiedy dodać domyślną wartość do właściwości zależność:
Kod kompiluje, ale wywala z fatalnym wyjątkiem kiedy próbuje instancję UserControl.

Dla porównania, mój kod wygląda teraz tak - z linii PropertyMetaData dodania:

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); } 
} 

Zdejmowanie PropertyMetadata od wezwania do zapisania() powoduje, że program funkcjonuje doskonale, bez żadnych wypadków lub jakikolwiek inny problemy. Ale potrzebuję wartości domyślnej dla późniejszego kodu. Jak mogę go zaakceptować wartość domyślną bez awarii?

kiedy się zawiesi, następujące wyjątki są wyświetlane w oknie wyjściowym:

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 

Muszę dostać tę pracę jak najszybciej, więc każda rada będzie niesamowite!

+0

Gdybyś miał ślad stosu, byłoby to niezwykle pomocne. –

+0

Naprawdę? Nie miałem pojęcia, że ​​było to powiązane. Lemme, zobacz, co mogę wymyślić ... Może nie zdołam się do tego obejść przez chwilę - zajęty czymś, co się nagli. – Giffyguy

Odpowiedz

17

Krótka odpowiedź:

Zależność wartości domyślne nieruchomość muszą być bezpieczne wątek (np dziedziczą System.Windows.Freezable) ale System.Windows.Forms.Rectangle nie jest.

Długa odpowiedź:

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

Podpowiedź:

Jeśli używasz Visual Studio to naprawdę pomaga pozwolić przerwa IDE na każdym wyjątkiem wyrzucane. Po prostu przejdź do "Debuguj" -> "Wyjątki" i sprawdź "Wyjątki dla Runtime Common Language" "Wyrzucony".

Następnie zostanie wyświetlony monit i pojawi się komunikat wyjątku, który w twoim przypadku wygląda następująco: "Informacje dodatkowe: Domyślna wartość właściwości" Rect "nie może być powiązana z określonym wątkiem."