2011-08-30 23 views
13

Tengo una aplicación winform que tiene un número dinámico (basado en un valor de base de datos) de PictureBoxes. Cada P-Box tiene un control Tooltip.¿Cómo puedo cambiar el texto de un control ToolTip existente en PictureBox en mi aplicación WinForm?

¿Cómo puedo cambiar el texto de información sobre herramientas sin tener pérdidas de memoria? En este momento, tengo el siguiente código, pero está perdiendo memoria => los controles ToolTip anteriores no reciben GC'd.

Por cierto, este es un subproceso de fondo que está tratando de actualizar el hilo principal interfaz de usuario ....

if (pictureBox == null || !pictureBox.IsHandleCreated) { 
    continue; 
} 

Action setTooltipAndImage =() => { 
    var toolTip = new ToolTip(); 
    GameServer tempGameFile = gameServer; 
    toolTip.SetToolTip(pictureBox, string.Format(...)); 
    pictureBox.Image = Resources.RedButton; 
}; 

if (pictureBox.InvokeRequired) {       
    pictureBox.Invoke(setTooltipAndImage); 
} else { 
    setTooltipAndImage(); 
} 

Como dije - esto funciona, pero que hay un escape.

¿Alguien tiene alguna sugerencia?

+0

hmm .. why the downvote? parece una pregunta honesta? –

+0

+1 para volver a cero, parece una pregunta totalmente aceptable. BTW: ¿qué herramientas estás usando para ver la fuga de memoria ToolTip? –

+0

Estoy usando ANTS Memory Profiler. Aquí hay una pregunta similar que hice con capturas de pantalla: http://stackoverflow.com/questions/7225959/how-can-i-debug-this-stackoverflowexception-in-my-winform-application –

Respuesta

19

No cree una nueva información sobre herramientas cada vez. Agregue una información sobre herramientas al formulario utilizando el diseñador visual, como lo haría con cualquier otro control o componente. Llame al toolTip.SetToolTip(...) en la información sobre herramientas del formulario cada vez. La información sobre herramientas se eliminará cuando se elimine el formulario.

+0

El problema con eso es que no lo hago saber cuantos necesito Se basa en algunos datos dinámicos. Entonces necesito hacerlos dinámicamente. –

+7

Solo necesita uno. Un componente ToolTip puede proporcionar consejos para miles de controles. Cuando llama a 'toolTip.SetToolTip (Control, Text)', agrega el control y el texto a una colección interna y maneja los eventos del mouse del control. Cuando pasa el mouse sobre un control, el componente ToolTip busca el texto asociado. Para eliminar una entrada de esta colección, llame a 'toolTip.SetToolTip (Control, null)' –

+0

W00t - parece que ese es el truco :) parece bueno ... –

2

Sí, no necesita crear una nueva información sobre herramientas cada vez, una sola información sobre herramientas lo hará. No hay problema si no sabe la cantidad de información sobre herramientas que desea, ya que si solo hay una información sobre herramientas en toolTip1, puede usar lo siguiente cada vez que desee cambiar el título de la información sobre herramientas y controlar algún evento. Solo necesita una instancia de información sobre herramientas por formulario.

toolTip1.SetToolTip(Current_pictureBox, "<tool tip string>"); 
Cuestiones relacionadas