winforms - para - ¿Cómo puedo mostrar una información sobre herramientas en un botón deshabilitado?
codigo para boton cancelar en c# (4)
Coloque el botón (o cualquier control que se ajuste a este escenario) en un contenedor (panel, tableLayoutPanel) y asocie la información sobre herramientas a la celda del panel subyacente correspondiente. Funciona muy bien en una serie de escenarios, flexible. Consejo: haga que la celda sea lo suficientemente grande como para contener el bttn, por lo que la respuesta del mouseover (visualización de información sobre herramientas) no parece "sangrar" fuera de los bordes de bttn.
Si tiene un botón desactivado en un winform, ¿cómo puede mostrar un tool-tip al pasar el mouse para informar al usuario por qué el botón está deshabilitado?
Desde entonces, he adaptado la respuesta de BobbyShaftoe para ser un poco más general
Notas:
El evento MouseMove debe establecerse en el control principal (un panel en mi caso)
private void TimeWorks_MouseMove(object sender, MouseEventArgs e) { var parent = sender as Control; if (parent==null) { return; } var ctrl = parent.GetChildAtPoint(e.Location); if (ctrl != null && !ctrl.Enabled) { if (ctrl.Visible && toolTip1.Tag==null) { var tipstring = toolTip1.GetToolTip(ctrl); toolTip1.Show(tipstring, ctrl, ctrl.Width / 2, ctrl.Height / 2); toolTip1.Tag = ctrl; } } else { ctrl = toolTip1.Tag as Control; if (ctrl != null) { toolTip1.Hide(ctrl); toolTip1.Tag = null; } } }
Entonces, suponiendo que su control se llama "botón1", podría hacer algo como esto. Tienes que hacerlo manejando el evento MouseMove de tu formulario, ya que los eventos no se dispararán desde tu control.
bool IsShown = false;
void Form1_MouseMove(object sender, MouseEventArgs e)
{
Control ctrl = this.GetChildAtPoint(e.Location);
if (ctrl != null)
{
if (ctrl == this.button1 && !IsShown)
{
string tipstring =
this.toolTip1.GetToolTip(this.button1);
this.toolTip1.Show(tipstring, this.button1,
this.button1.Width /2, this.button1.Height / 2);
IsShown = true;
}
}
else
{
this.toolTip1.Hide(this.button1);
IsShown = false;
}
}
Sam Mackrill, gracias por tu respuesta, gran idea para usar la etiqueta para saber qué control estás dejando. Sin embargo, todavía necesita la bandera IsShown según la respuesta de BobbyShaftoe. Si tiene el mouse en el lugar equivocado, si la información sobre herramientas aparece debajo, puede disparar otro evento MouseMove (aunque no movió físicamente el mouse). Esto puede causar algo de animación no deseada, ya que la información sobre herramientas desaparece continuamente y vuelve a aparecer.
Aquí está mi código:
private bool toolTipShown = false;
private void TimeWorks_MouseMove(object sender, MouseEventArgs e)
{
var parent = sender as Control;
if (parent == null)
{
return;
}
var ctrl = parent.GetChildAtPoint(e.Location);
if (ctrl != null)
{
if (ctrl.Visible && toolTip1.Tag == null)
{
if (!toolTipShown)
{
var tipstring = toolTip1.GetToolTip(ctrl);
toolTip1.Show(tipstring.Trim(), ctrl, ctrl.Width / 2, ctrl.Height / 2);
toolTip1.Tag = ctrl;
toolTipShown = true;
}
}
}
else
{
ctrl = toolTip1.Tag as Control;
if (ctrl != null)
{
toolTip1.Hide(ctrl);
toolTip1.Tag = null;
toolTipShown = false;
}
}
}