2009-07-22 8 views
7

¿Por qué una implementación de propiedad de dependencia bloqueará mi aplicación cuando proporcione un valor predeterminado?¿Por qué una implementación de propiedad de dependencia bloqueará mi aplicación cuando proporcione un valor predeterminado?

Este segmento de código está en la declaración de clase para mi objeto UserControl. Todo funciona bien, se compila y funciona perfectamente.

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

Sin embargo, cuando agrego el valor predeterminado para la propiedad de dependencia:
El código se compila, pero se bloquea con una excepción grave cuando se trata de crear una instancia del control de usuario.

Como referencia, el código se verá así - con la línea PropertyMetadata añadido:

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

Extracción de la PropertyMetadata de la llamada a Register() hace que el programa funcione a la perfección, sin ningún tipo de accidentes o cualquier otra problemas. Pero necesito el valor predeterminado para el código posterior. ¿Cómo puedo conseguir que acepte el valor predeterminado sin bloquearse?

Cuando se bloquea, las siguientes excepciones se muestran en la ventana de salida:

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 

Necesito conseguir este funcionamiento lo antes posible, por lo que cualquier consejo sería increíble!

+0

Si tuviera un rastro de pila, sería extremadamente útil. –

+0

¿De verdad? No tenía idea de que estaba relacionado. Déjame ver lo que se me ocurre ... Puede que no lo haga por un tiempo, ocupado en algo apremiante. – Giffyguy

Respuesta

17

Respuesta corta:

dependencia valores por defecto propiedad tienen que ser seguro para subprocesos (por ejemplo heredan de System.Windows.Freezable), pero no es System.Windows.Forms.Rectangle.

Respuesta larga:

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

Consejo:

Si está utilizando Visual Studio lo que realmente ayuda a dejar que la ruptura IDE en toda excepción que es lanzado. Simplemente vaya a "Depurar" -> "Excepciones" y verifique "Excepciones comunes de tiempo de ejecución de idioma" "Lanzado".

Luego se le preguntará y obtendrá el mensaje de excepción que en su caso se ve así: "Información adicional: el valor predeterminado para la propiedad 'Rect' no puede vincularse a un hilo específico."

Cuestiones relacionadas