La causa más común de esto es si cambia el nombre de un conjunto. Explicaré ese escenario, luego daré otras posibilidades.
Supongamos que tiene un proyecto de DLL "Abc" que contiene UserControl "MyControl". El InitializeComponent generado para MyControl en Abc.dll contendrá el Uri "/Abc;Component/MyControl.xaml".
En tiempo de ejecución, se extrae el nombre del ensamblado "Abc" y se buscan los conjuntos cargados para un ensamblaje con ese nombre. Si se encuentra dicho ensamblado pero no tiene un recurso "MyControl.xaml", recibirá el error que publicó en la pregunta.
Así que aquí está el panorama:
- cambia el nombre del archivo Abc.dll a Def.dll
- Usted (o alguien) crea un archivo diferente Abc.dll
- En su proyecto se hace referencia Def.dll (que fue compilado como Abc.dll)
- su proyecto también hace referencia directa o indirectamente Abc.dll por lo que se carga cuando se crea una instancia MyControl
Ahora cuando instancias MyControl desde Def.dll, busca su xaml en el ensamblado Abc.dll en lugar del ensamblado Def.dll.
Algunos otros escenarios en los que esto puede suceder:
Tiene un archivo .g.cs rancio en su directorio obj que tiene el nombre equivocado para el archivo XAML. Esto puede suceder si cambiaste el código fuente sin actualizar la fecha (lo que puede ocurrir durante un pago desde un sistema de control de origen o descomprimir un archivo comprimido o de muchas otras maneras). Limpiar y reconstruir la solución solucionará esto. Como su comentario dice que probó esto, esto no se aplica a usted.
Estás editando manualmente los nombres de recursos en el archivo .dll después de que ha sido compilado
ha cargado dos conjuntos con el mismo nombre (sí, esto es posible), y el cargador de recursos encontrado el mal uno
Tenga en cuenta que cualquier cambio en la ruta de acceso al archivo XAML, tales como el cambio de nombre o moverlo, puede causar este problema si el archivo .g.cs no coincide con la trayectoria de los recursos.
Para diagnosticar su problema más le recomendamos que descargue una copia de NET Reflector y mire su.Archivo dll para ver:
- ¿Qué Uri especifica InitializeComponent()?
- ¿Hay un archivo .baml con el mismo nombre?
También puede examinar la pila de llamadas en el punto donde se lanza la excepción para asegurarse de que el administrador de recursos que está utilizando tiene una referencia al ensamblado esperado, no a otro ensamblaje.
solución limpia y reconstruir, puede ser que le ayudará. –
Ya lo intenté sin éxito. –
Extraño ... Creé una nueva versión para probar la respuesta de Ray Burns a continuación y ahora parece estar funcionando bien. Podría haber jurado que hice al menos dos ciclos de construcción limpia. –