2009-05-14 32 views
17

En mi UI XAML, esencialmente heredo de una clase "BaseView" que contiene funcionalidades comunes a varios formularios, sin embargo, esto impide que el diseñador muestre el formulario: "Podría no crear instancia de tipo BaseView ". El código se compilará y ejecutará, pero es frustrante no poder ver el formulario en el Diseñador. ¿Hay una mejor manera? Gracias.WPF Designer "No se pudo crear una instancia de tipo"

XAML:

<vw:BaseView 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:vw="clr-namespace:ReviewClient" 
    x:Class="ReviewClient.MainPage" 

...

+0

¿Es ReviewClient el ensamblaje principal del XAML? De lo contrario, necesitaría agregar una referencia de ReviewClient al ensamblaje que contiene este archivo XAML. – Gishu

+0

ReviewClient es el espacio de nombre local. – jchadhowell

Respuesta

21

El problema era que la clase base se definió como abstracto. Esto causó que el diseñador fallara. Este problema se describe con más detalle en la sección de comentarios del blog de Laurent Bugnion: http://geekswithblogs.net/lbugnion/archive/2007/03/02/107747.aspx

+2

¡Gracias! Solo estaba teniendo este problema yo mismo. – Stephen

+0

No puedo ver la solución, para el diseñador, en el enlace que anotó. –

+0

La solución es hacer que la clase base sea concreta (es decir, elimine la palabra clave abstracta de la clasificación básica). No es una solución muy satisfactoria, pero funciona. –

4

Otra posible causa, como acabamos de encontrar aquí, así que estoy agregando esta respuesta para futuros usuarios, es si el proyecto está alojado en un fuente no confiable, como un servidor de archivos.

En ese caso, el diseñador no cargaría el ensamblado y, por lo tanto, emitió el mismo error "No se pudo crear la instancia ...". La solución aún se compilaría y depuraría OK.

1

Otra posible causa.

Tengo un control de usuario que tiene controles secundarios que generan eventos, p. selection_changed en control de lista. El controlador de eventos select_changed realiza cambios en otros controles secundarios.

Durante la inicialización, la propiedad del elemento seleccionado del cuadro de lista se cambia y desencadena un evento selection_changed. El controlador intenta actualizar los otros controles secundarios pero no puede porque todavía no se han instanciado. Esto lleva a una excepción de puntero nulo y causa el problema.

Una vez que se manejó el problema del puntero nulo, el control se pudo crear una instancia y apareció en el control principal.

0

Tengo el problema de que mi clase MVVM tiene acceso a la base de datos en el constructor y ese fue el problema, arroja una excepción. Solo tengo que verificar si la aplicación se está ejecutando en modo Diseño.

2

Otra causa. Mi clase de control tenía un campo estático que fue inicializado a partir de recursos, así:

static Color s_ImgColor = (Color)TheApp.Resources["PhoneForegroundColor"]; 

ello equivaldría a una excepción de referencia nula en el editor XAML, ya que los recursos no están disponibles en el modo de diseño. Si no fuera un recurso de color (por ejemplo, un pincel), esto no será un problema, pero un tipo de tipo de valor invertido arroja una referencia nula.

0

En WinForms, es posible utilizar el diseñador con controles abstractos si se utiliza una costumbre TypeDescriptionProvider informar al diseñador de una aplicación concreta:

estoy usando la solución en this answer a otra pregunta, que une this article . El artículo recomienda usar un TypeDescriptionProvider personalizado y una implementación concreta de la clase abstracta. El diseñador le preguntará al proveedor personalizado qué tipos usar, y su código puede devolver la clase concreta para que el diseñador esté contento mientras usted tiene control total sobre cómo la clase abstracta aparece como una clase concreta.

7

Encontré una solución muy útil para esto en: http://www.progware.org/Blog/post/WPF-Designer-Error-Could-not-create-an-instance-of-type.aspx.

Este enlace se explica cómo la ventana del diseñador WPF se ejecuta el constructor para mostrar la interfaz de usuario en XAML y el remedio: añadir el siguiente fragmento a cualquier parte del código de constructor que podría estar dando error:

if(!System.ComponentModel.DesignerProperties.GetIsInDesignMode(this)) 
{ 
    //code producing exception   
} 

la el nombre de la función es auto explicativo. :) Este enlace también proporciona soluciones sobre problemas de depuración con XAML.

0

Y otra situación posible (esto es real para, al menos, SL WP):

Si crea instanse de la clase (Ej. <local:MyDataSource />) entonces que debería ser pública. Si su clase es interna, funcionará en tiempo de diseño pero fallará con esta excepción en tiempo de ejecución.

0

La razón por la que recibí este error fue simple pero difícil de rastrear. Mi clase de convertidor no era pública. Simplemente cambiar la accesibilidad de la clase lo solucionó.

public class StringToLowerConverter : IValueConverter 
Cuestiones relacionadas