2010-09-01 15 views
8

Tengo algunos recursos (imágenes en este caso) en un archivo de recursos que utilizo en controles en mi proyecto de Windows Forms. El cuadro de diálogo Selección de recursos de Visual Studio no admite muy bien la elección de imágenes de los archivos de recursos a menos que estén en ubicaciones específicas, pero puede editar directamente el archivo de diseñador, y esto funciona perfectamente; la aplicación se compila y se ejecuta correctamente, y Windows Forms Designer es lo suficientemente inteligente como para no estropear mi código editado a mano.¿Cómo hago para que Windows Forms Designer use los recursos del ensamblado externo?

// in an assembly named ResourceConsumer 
this.button1.Image = global::ResourceConsumer.Properties.Resources.Close32x32; 

Ahora quiero mover esos recursos a un ensamblaje externo para que puedan ser utilizados por múltiples aplicaciones. Puedo configurar un ensamblaje para exponer sus recursos sin problemas (siempre que use Visual Studio 2008 o posterior), y esto funciona bien. Cuando cambio el código del diseñador para hacer referencia a la imagen desde su nueva ubicación, el código se compila y se ejecuta correctamente, pero ahora el Diseñador de Windows Forms cambia mi código cada vez que genera código; incrusta el binario de la imagen en el archivo de recursos local y lo referencia desde allí.

// ResourceProducer is an external assembly containing resources 
this.button1.Image = global::ResourceProducer.Properties.Resources.Exit32x32; 

se cambia por el Diseñador de Windows Forms a:

this.button1.Image = ((System.Drawing.Image)(resources.GetObject("button1.Image"))); 

El Diseñador de Windows Forms parece entender que tira de un recurso desde dentro del mismo conjunto, pero no uno externo. ¿Hay alguna manera de que Windows Forms Designer me permita usar un recurso de un ensamblado externo?

Respuesta

2

No, el diseñador no es compatible con esto. Importante que funcione de la forma en que funciona, la localización a través de ensambles satelitales no funcionaría de otra manera.

Puede hacerlo, pero tiene que escribir el código usted mismo. Más o menos lo que encuentras en el archivo Resources.Designer.cs. Considere si vale la pena el esfuerzo, no es muy fácil de mantener y compartir conjuntos de recursos no es una gran optimización. Un disco de terabyte cuesta menos de cien dólares.

Btw: nunca edite el archivo Resources.Designer.cs usted mismo.

+1

De hecho, no he podido encontrar de todos modos para que el diseñador apoye esto, pero ¿a qué te refieres cuando dices "la localización a través de ensambles satelitales no funcionaría"? Nos gustaría consolidar los recursos para reducir la duplicación de código y el esfuerzo de localización; sería más fácil incluir y localizar un recurso una vez en lugar de en cada proyecto que lo necesita. ¿No se recuperarían los recursos localizados según los ensamblajes de satélites del conjunto de recursos en este caso? Si es así, aún podríamos usar un conjunto de recursos para proyectos que no necesitan soporte de diseñador. –

3

Tengo exactamente el same problem y puede haber un enfoque alternativo, dependiendo de su código base. Si las propiedades que se han modificado para hacer referencia a un recurso específico están en controles personalizados, puede agregar el atributo [[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] a esas propiedades (anularlas u ocultarlas, si es necesario) y el Diseñador las dejará en paz.

Sin embargo, si las propiedades están en elementos básicos de la interfaz de usuario (por ejemplo, Form.BackgroundImage), entonces tendría que tener que anularlas u ocultarlas también y no estoy seguro de lo conveniente que es.

Cuestiones relacionadas