2009-08-05 11 views
12

¿Puedo cambiar el icono predeterminado que se utiliza en un Winform?cambio predeterminado Winform icono a través de toda la aplicación

La mayoría de mis formas tienen su propiedad icon establece en un icono personalizado. Para las pocas formas que se deslizan por las grietas, no quiero que el icono genérico "¡mira, hizo esto en el estudio visual"!

Una solución es comprobar tediosamente cada una de mis formas para asegurarse de que o bien tienen un icono personalizado ajustado o han ShowIcon se establece en False.

Otra solución es que cada una de mis formas heredar de una clase base que fija un icono personalizado en el constructor.

Aparte de esas soluciones, ¿qué otras opciones tengo?

EDIT: Tenía la esperanza de que hubiera una manera de reemplazar la fuente del icono de stock con la mía. ¿Está en algún archivo de recursos? ¿O está incrustado en un dll .NET que no puedo (o realmente, no debería) modificar?

BOUNTY EDIT: ¿Hay alguna manera de lograr esto sin editar ni escribir una sola línea de código? No me importa lo poco práctica, complicada y perdida de tiempo que sea la solución ... Solo quiero saber si es posible. Necesito satisfacer mi curiosidad.

Respuesta

24

El icono predeterminado está incrustado en el archivo DLL de Windows Forms - mirando reflector (DefaultIcon) es:

defaultIcon = new Icon(typeof(Form), "wfc.ico"); 

No hay magia en el que hay que comprueba otro lugar común, por lo que no puede hacer sin cambiar el código

¿Siempre podría abrazar las fuerzas de la oscuridad con la reflexión de campo? Nota: esto es hacky y frágil. En tu propia cabeza! Pero funciona:

[STAThread] 
static void Main() { 
    // pure evil 
    typeof(Form).GetField("defaultIcon", 
      BindingFlags.NonPublic | BindingFlags.Static) 
     .SetValue(null, SystemIcons.Shield); 

    // all forms now default to a shield 
    using (Form form = new Form()) { 
     Application.Run(form); 
    } 
} 

para hacerlo correctamente; dos opciones comunes;

  • un Form clase base que tiene el conjunto de iconos
  • un método de fábrica Form - tal vez algo como:

código:

public static T CreateForm<T>() where T : Form, new() { 
    T frm = new T(); 
    frm.Icon = ... 
    // any other common code 
    return frm; 
} 

Entonces, en lugar de:

using(var frm = new MySpecificForm()) { 
    // common init code 
} 

Algo así como:

using(var frm = Utils.CreateForm<MySpecificForm>()) { 

} 

Por supuesto - que no es mucho más bonita! Otra opción podría ser un método de extensión de C# 3.0, tal vez como una API fluida:

public static T CommonInit<T>(this T form) where T : Form { 
    if(form != null) { 
     form.Icon = ... 
     //etc 
    } 
    return form; 
} 

y

using(var frm = new MySpecificForm().CommonInit()) { 
    // ready to use 
} 

Ésta es entonces sólo un .CommonInit() lejos de su código existente.

+0

Aceptado para encontrar el icono ... lo suficientemente cerca –

+0

Esto es absolutamente genial. Me salvó de ejecutar en 50 formularios ... –

+0

La opción de reflexión funcionó muy bien, y con la API de reflexión de O2 Platform, el código para hacerlo no se ve tan aterrador typeof (Form) .fieldValue ("defaultIcon", SystemIcons .Proteger); –

4

La opción de clase base es la que utilizamos.

Si está buscando una alternativa (no necesariamente buena), puede: 1. Use IOC para crear una instancia de todos sus formularios y modifique el contenedor IOC para establecer el icono de la aplicación. 2. Use AOP para insertar el código en todos los formularios que configuran el icono de la aplicación.

Personalmente, sólo tiene que utilizar la clase base ...

0

Si todas sus formas están en un solo proyecto, entonces puede tomar la dll del proyecto y utilizar la reflexión para obtener todo tipo en la DLL. Si el tipo proviene de Form, puede establecer la propiedad Icon del tipo en lo que desee. No estoy seguro de cuáles serán los gastos generales de rendimiento si el proyecto es muy grande.

1

Si desea actualizar todos los iconos por otro, se puede construir una pequeña aplicación que edita todos los archivos * .Designer.vb (en vb.net) y añadiendo la línea folowing a InitializeComponent:

Me.Icon = New System.Drawing.Icon("C:\PathTo\icon.ico") 

Espero que ayude.

2

Mi respuesta útil:

Sin

sería una buena característica de Microsoft para implementar embargo, ya que la mayoría de las aplicaciones utilizan el mismo icono en toda la aplicación.

Cuestiones relacionadas