Cómo crear y utilizar recursos en .NET

Resuelto Matthew Scharley asked hace 16 años • 4 respuestas

¿Cómo creo un recurso al que puedo hacer referencia y utilizarlo fácilmente en varias partes de mi programa?

Mi problema específico es que tengo un NotifyIcon cuyo ícono quiero cambiar según el estado del programa. Un problema común, pero con el que he estado luchando durante mucho tiempo.

Matthew Scharley avatar Sep 18 '08 14:09 Matthew Scharley
Aceptado

Bueno, después de buscar y reunir varios puntos de StackOverflow (caramba, ya me encanta este lugar), la mayoría de los problemas ya habían superado esta etapa. Sin embargo, logré encontrar una respuesta a mi problema.

Cómo crear un recurso:

En mi caso, quiero crear un ícono. Es un proceso similar, sin importar qué tipo de datos desee agregar como recurso.

  • Haga clic derecho en el proyecto al que desea agregar un recurso. Haga esto en el Explorador de soluciones. Seleccione la opción "Propiedades" de la lista.
  • Haga clic en la pestaña "Recursos".
  • El primer botón en la parte superior de la barra le permitirá seleccionar el tipo de recurso que desea agregar. Debería comenzar con una cuerda. Queremos agregar un ícono, así que haga clic en él y seleccione "Iconos" de la lista de opciones.
  • A continuación, pase al segundo botón, "Agregar recurso". Puede agregar un nuevo recurso o, si ya tiene un ícono creado, también puede agregarlo. Siga las indicaciones para cualquier opción que elija.
  • En este punto, puede hacer doble clic en el recurso recién agregado para editarlo. Tenga en cuenta que los recursos también aparecen en el Explorador de soluciones y hacer doble clic allí es igual de efectivo.

Cómo utilizar un recurso:

Genial, tenemos nuestro nuevo recurso y estamos ansiosos por tener esos encantadores íconos cambiantes... ¿Cómo hacemos eso? Bueno, por suerte, C# hace que esto sea extremadamente fácil.

Hay una clase estática llamada Properties.Resourcesque te da acceso a todos tus recursos, por lo que mi código terminó siendo tan simple como:

paused = !paused;
if (paused)
    notifyIcon.Icon = Properties.Resources.RedIcon;
else
    notifyIcon.Icon = Properties.Resources.GreenIcon;

¡Hecho! ¡Finalizado! Todo es sencillo cuando sabes cómo, ¿no?

Matthew Scharley avatar Sep 18 '2008 07:09 Matthew Scharley

Lo anterior en realidad no funcionó para mí como esperaba con Visual Studio 2010. No me permitió acceder a Properties.Resources, dijo que era inaccesible debido a problemas de permisos. Finalmente tuve que cambiar la configuración de Persistencia en las propiedades del recurso y luego descubrí cómo acceder a él a través del archivo Resources.Designer.cs, donde tenía un captador automático que me permitía acceder al ícono, a través de MyNamespace.Properties.Resources. .NameFromAddingTheResource. Eso devuelve un objeto de tipo Icono, listo para usar.

Quinxy von Besiex avatar Jun 14 '2011 19:06 Quinxy von Besiex

El método anterior funciona bien.

Otro método (supongo que aquí es web) es crear su página. Agregue controles a la página. Luego, en modo diseño, vaya a: Herramientas > Generar recurso local . Un archivo de recursos aparecerá automáticamente en la solución con todos los controles de la página asignados en el archivo de recursos.

Para crear recursos para otros idiomas, agregue el idioma de 4 caracteres al final del nombre del archivo, antes de la extensión ( Account.aspx.en-US.resx, Account.aspx.es-ES.resx ...etc).

Para recuperar entradas específicas en el código subyacente, simplemente llame a este método: GetLocalResourceObject([resource entry key/name]).

Chuck Conway avatar Sep 18 '2008 07:09 Chuck Conway

El código publicado por Matthew Scharley tiene una pérdida de memoria:

paused = !paused;
if (paused)
    notifyIcon.Icon = Properties.Resources.RedIcon;
else
    notifyIcon.Icon = Properties.Resources.GreenIcon;

Debes Dispose()notificar a Icon.Icon antes de reemplazarlo, porque Properties.Resources.SOME_ICONcrea uno nuevo Iconcada vez que se usa. Esto se puede observar en el log, con este código:

Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());
Console.WriteLine(Properties.Resources.RedIcon.GetHashCode());

Verá 3 códigos Hash diferentes en el registro. Esto significa que estos son Objetos diferentes.

Entonces, la solución simple será:

paused = !paused;
notifyIcon.Icon?.Dispose();
notifyIcon.Icon = paused 
                    ? Properties.Resources.RedIcon;
                    : Properties.Resources.GreenIcon;
Wojciech avatar Jun 13 '2021 12:06 Wojciech