2009-07-22 11 views
12

Actualmente estoy añadiendo un texto de ayuda a una etiqueta de este modo:¿Cómo elimino una información sobre herramientas vinculada actualmente a un control?

ToolTip LabelToolTip = new System.Windows.Forms.ToolTip(); 
LabelToolTip.SetToolTip(this.LocationLabel, text); 

Cuando necesito cambiar esta información sobre herramientas como cambios en el texto de la etiqueta, trato de hacer lo mismo para añadir una nueva descripción. Desafortunadamente, la información sobre herramientas anterior permanece debajo de la nueva, lo cual es realmente molesto. ¿Hay algún método para eliminar la información sobre herramientas anterior, o debería crear una nueva etiqueta cuando quiero cambiar el texto en una etiqueta?

Respuesta

15

Crea una instancia única de ToolTip y úsala cuando quieras mostrarla usando el método SetToolTip y usa el método Hide para ocultarla. En general, no es necesario crear más de una instancia de ToolTip.

+2

Ah, por lo que sólo debería tener una variable de instancia de clase que sostiene un objeto de información sobre herramientas en su lugar, y volver a utilizarlo cuando se necesita ser cambiado. Muchas gracias. – benmatth

4
public class ToolTipHelper 
{ 
    private readonly Dictionary<string, ToolTip> tooltips; 

    /// <summary> 
    /// Constructor 
    /// </summary> 
    public ToolTipHelper() 
    { 
     this.tooltips = new Dictionary<string, ToolTip>(); 
    } 

    /// <summary> 
    /// Key a tooltip by its control name 
    /// </summary> 
    /// <param name="controlName"></param> 
    /// <returns></returns> 
    public ToolTip GetControlToolTip(string controlName) 
    { 
     if (tooltips.ContainsKey(controlName)) 
     { 
      return tooltips[controlName]; 
     } 
     else 
     { 
      ToolTip tt = new ToolTip(); 
      tooltips.Add(controlName, tt); 
      return tt; 
     } 
    } 
} 

Uso:

var tt = toolTips.GetControlToolTip("button1"); 
tt.SetToolTip(button1, "This is my button1 tooltip"); 
tt = toolTips.GetControlToolTip("button2"); 
tt.SetToolTip(button2, "This is my button2 tooltip"); 
5

he modificado el código de Gavin Stevens para hacer que todo estática, así:

class ToolTipHelper 
{ 
    private static readonly Dictionary<string, ToolTip> tooltips = new Dictionary<string, ToolTip>(); 

    public static ToolTip GetControlToolTip(string controlName) 
    { 
     <same as above> 
    } 
} 

Ahora usted ya no tiene que crear una instancia de un ToolTipHelper (por lo tanto, no tiene necesidad de constructor), y por lo tanto ahora puede acceder a esto desde cualquier clase como lo siguiente:

ToolTip tt = ToolTipHelper.GetControlToolTip("button1"); 
tt.SetToolTip(button1, "This is my button1 tooltip"); 

También es útil con cualquiera de las versiones para activar y desactivar una información sobre herramientas, simplemente puede establecer tt.Active verdadero o falso.

edición

mejorado aún más en esto:

class ToolTipHelper 
{ 
    private static readonly Dictionary<string, ToolTip> tooltips = new Dictionary<string, ToolTip>(); 
    public static ToolTip GetControlToolTip(string controlName) 
    { 
     <same as above still> 
    } 
    public static ToolTip GetControlToolTip(Control control) 
    { 
     return GetControlToolTip(control.Name); 
    } 
    public static void SetToolTip(Control control, string text) 
    { 
     ToolTip tt = GetControlToolTip(control); 
     tt.SetToolTip(control, text); 
    } 
} 

Así que ahora, un mensaje de ayuda desde cualquier lugar en el programa es sólo una línea:

ToolTipHelper.SetToolTip(button1, "This is my button1 tooltip"); 

Si no' Necesito tener acceso a las funciones anteriores, puede combinarlas y/o hacerlas privadas, por lo que el SetToolTip() es el único que nos tiene. mi.

+0

Supongo que Gavin Stevens merece crédito, pero me encanta la solución estática. Sin entrar en demasiados detalles, tenía una forma muy complicada con cientos de controles a los que se les asignaban información sobre herramientas en cada envío de formularios y por lo tanto nunca se podían eliminar los antiguos. Esta solución me salvó de un dolor de cabeza considerable. – 333Matt

+0

Sí, la estática es mejor! –

3

simplemente eliminar la descripción del control, podría modificar la clase como esta:

public static void SetToolTip(Control control, string text) 
    { 
     if (String.IsNullOrEmpty(text)) 
     { 
      if (tooltips.ContainsKey(control.Name)) 
      { 
       GetControlToolTip(control).RemoveAll(); 
       tooltips.Remove(control.Name); 
      } 
     } 
     else 
     { 
      ToolTip tt = GetControlToolTip(control); 
      tt.SetToolTip(control, text); 
     } 
    } 

y utilizar este comando:

ToolTipHelper.SetToolTip(control, "") 
0

El objeto sobre herramientas funciona en múltiples controles al mismo hora.

Crea una instancia única de la información sobre herramientas y úsala para agregar y eliminar una información sobre herramientas de cualquier control.

Al añadir simplemente debe utilizar .SetToolTip (Control "mensaje que va a apear al vuelo estacionario") Al retirar que acaba de establecer de nuevo a cero con .SetToolTip (Control, null).

+0

Si va a citar una fuente, debe atribuir esa fuente en su publicación. – LarsTech

Cuestiones relacionadas