如果在 Windows 窗体中有一个禁用的按钮,如何在鼠标悬停时显示工具提示以告诉用户该按钮被禁用的原因?
将按钮(或任何适合此场景的控件)放置在容器中(面板、表格面板),并将工具提示关联到相应的基础面板单元格。它在许多场景下都非常出色、灵活。Tip:使单元格足够大以容纳按钮,这样鼠标悬停响应(工具提示显示)就不会似乎“渗”出按钮边界。
我已经根据BobbyShaftoe的答案进行了修改,使其更加普遍适用
注意事项:
MouseMove事件必须在父控件上设置(在我的情况下是一个面板)
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;
}
}
}
感谢Sam Mackrill的答案,利用标签知道你正在离开哪个控件是一个好主意。然而根据BobbyShaftoe的回答,你仍然需要 IsShown 标志。如果鼠标位置错误,在工具提示出现在其下方时,它可能会触发另一个 MouseMove 事件(即使您没有实际移动鼠标)。这可能会导致一些不必要的动画效果,因为工具提示不断消失和重新出现。
这是我的代码:
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;
}
}
}
parent
控件本身具有 toolTip 时,否则来自 @SamMackrill 的代码对我而言就行得通。@flixfe:如果你正在使用 TabControl,则可以这样做:if (ctrl.GetType().IsInstanceOfType(typeof(TabControl))) ctrl = ((TabControl)ctrl).SelectedTab;
以获取当前选定的标签页。 - Damian Vogel假设你的控件名为button1
,你可以像这样操作。
由于事件不会从控件触发,所以必须通过处理窗体的MouseMove
事件来实现。
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;
}
}