2009-07-22 12 views
7

Perché l'implementazione della proprietà di dipendenza si arresta in modo anomalo quando viene fornito un valore predefinito?Perché l'implementazione di proprietà dipendenti si blocca la mia applicazione quando fornisco un valore predefinito?

Questo segmento di codice è nella dichiarazione della classe per il mio oggetto UserControl. Tutto funziona bene: si compila e funziona perfettamente.

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

Tuttavia, quando aggiungo il valore predefinito per la proprietà di dipendenza:
il codice viene compilato, ma si blocca con un errore irreversibile quando si tenta di creare un'istanza di UserControl.

Per riferimento, il mio codice ora assomiglia a questo - con la linea PropertyMetadata aggiunto:

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

Rimozione del PropertyMetadata dalla chiamata al registro() fa sì che il programma per funzionare perfettamente, senza alcun crash o qualsiasi altra i problemi. Ma ho bisogno del valore predefinito per il codice successivo. Come posso convincerlo ad accettare il valore predefinito senza crash?

Quando si blocca, le seguenti eccezioni sono mostrati nella finestra di output:

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 

ho bisogno di ottenere questo lavoro al più presto, in modo che qualsiasi consiglio è impressionante!

+0

Se si dispone di una traccia stack, sarebbe estremamente utile. –

+0

Davvero? Non avevo idea che fosse correlato. Fammi vedere cosa riesco a inventare ... Potrei non farcela per un po ', impegnato in qualcosa di urgente. – Giffyguy

risposta

17

Risposta breve:

dipendenza valori di default di proprietà devono essere thread-safe (ad esempio ereditare da System.Windows.Freezable), ma non è System.Windows.Forms.Rectangle.

Risposta lunga:

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

Suggerimento:

Se si utilizza Visual Studio aiuta davvero a lasciare la pausa IDE su ogni eccezione essere gettato. Basta andare su "Debug" -> "Eccezioni" e spuntare "Common Language Runtime Exceptions" "Gettato".

Quindi verrà richiesto e ottenere il messaggio di eccezione che nel tuo caso è simile a questo: "Informazioni aggiuntive: il valore predefinito per la proprietà 'Rect' non può essere associato a un thread specifico."

Problemi correlati