Los recursos del archivo del proyecto en VS2008 se reutilizan & # 8220; & # 8221; creativamente por el diseñador de formularios, ¿es posible evitarlo?

StackOverflow https://stackoverflow.com/questions/435466

Pregunta

Tenemos algunos archivos de recursos generados automáticamente en nuestro proyecto en Visual Studio 2008, con algunas versiones localizadas, y en una de estas versiones localizadas, hay una cadena que en este caso está vacía.

Más explícito. Tenemos un archivo de recursos básicos, con muchos recursos de cadena. Luego tenemos otras 4 versiones localizadas de este archivo, y en uno de estos otros archivos localizados, una de las cadenas tiene un valor vacío.

El problema ahora es que el diseñador de formularios está bastante contento de haber encontrado un recurso para una cadena, y aparentemente no se detendrá ante nada por reutilizar este recurso para cualquier cadena vacía, asignará una propiedad en el código del diseñador generado para un formulario .

Por ejemplo, si por alguna razón una propiedad en un control no se especifica con un valor predeterminado (por lo que se serializará en el código incluso si está vacío), entonces hará referencia a nuestro recurso en lugar de escribir la cadena vacía literal en el código C #.

El problema es que hace referencia a las versiones localizadas, y estas no están compiladas en el código.

Aquí hay un ejemplo de código abreviado:

this.rpAllFields.KeyTip = 
  global::namespaces.SystemMessagesResources_sv_SE.
    dash_red_shift_info_description;

En este caso, el dash_red_shift_info_description no tiene un valor para el entorno local sv-SE, por lo que el diseñador, cuando vea una cadena vacía en el código, intentará vincular a ese recurso. Pero SystemMessagesResources_sv_SE no es una clase existente, sino que aparentemente es un nombre de clase generado para la versión localizada sueca del archivo de recursos SystemMessagesResources, que se compila en una clase.

¿Es esto posible evitarlo? Nos estamos cansando bastante de la búsqueda / reemplazo cada vez que cambiamos algo en los archivos de formulario, y estamos bastante seguros de que hay algo que hemos hecho para darme una palmada en la frente que hace que esto suceda, pero estamos aparentemente no somos capaces de encontrar la causa de esto nosotros mismos.

El código anterior, si eliminamos el recurso, se leería así:

this.rpAllFields.KeyTip = "";
¿Fue útil?

Solución

Puede intentar crear un recurso de cadena empty_string, definido como " " para cada localidad Si lo convierte en el primer recurso, el diseñador de formularios (con suerte) siempre elegirá ese como el valor para espolvorear sus formularios. De esta manera, al menos, usará una cadena designada para ese propósito.

Otros consejos

Si el problema está siendo causado por una cadena vacía en el archivo de recursos, ¿cuál sería el efecto de convertirlo en un espacio? Entonces, en lugar de " " el archivo de recursos contiene " " ;. No sé si esa es la mejor solución, pero me interesaría saber si impide que el diseñador use ese recurso como una cadena vacía predeterminada. Sin embargo, al no saber cómo se usa, no estoy seguro de cuál es el impacto de tener un valor que debería definirse como un espacio ...

¿Cuánto necesita un recurso cuyo valor es una cadena vacía? Puedo imaginar algunos escenarios multilingües donde alguna clave de recursos debería corresponder a un espacio en blanco en algunos de los idiomas admitidos (si está utilizando la concatenación de cadenas para algunos elementos de la interfaz de usuario), sí.

Pero si MI escenario no fuera algo así, simplemente eliminaría la entrada de recursos con la cadena vacía. Solo diría, "¿Qué texto de interfaz de usuario independiente se traduce en blanco, de todos modos?".

Si realmente necesito que el recurso esté en blanco en algunos casos (donde representa un artículo en un idioma y donde no existe una palabra equivalente en otro), trataría de ver si podría producir el mismo efecto de otra manera.

El archivo de recursos generados y la muestra de código serían buenos.

Y lo que estás diciendo es: ¿tienes una definición literal de cadena vacía en tu espacio de nombres (la primera encontrada) pero eso está causando algún problema? ¿No estará vacío en todo momento? Cuando compila el código, hace cosas extrañas como esta para ahorrar espacio. Me encontré con un problema similar al generar archivos XAML con código subyacente para la compilación automatizada sobre la marcha de archivos de ensamblaje: el compilador es lo suficientemente inteligente como para saber 'no hace la diferencia, pero para nosotros lo hizo porque cambiaría el nombre de los literales (que se usaron en otros lugares).

Para evitar esto, usamos tipos con nombre para estas primitivas en nuestro espacio de nombres y lo hicimos global. Lo que veo aquí es que su espacio de nombres global está llenando los espacios en blanco; es posible que desee tener uno 'debajo' que evalúe todas las cadenas nulas.

No he trabajado con esto en más de un año, así que perdóname si mi redacción es deficiente, pero lo que quiero decir es: piensa en XML. Debe usar explícitamente el espacio de nombres en las propiedades o asignarlos más abajo (como la propiedad adjunta en xaml).

Espero que esto ayude (y tenga sentido)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top