C# 如何在禁用的按钮上显示工具提示?
如果您在winform上有一个禁用的按钮,您如何在鼠标上方显示工具提示以通知用户按钮禁用的原因?因此,假设您的控件名为C# 如何在禁用的按钮上显示工具提示?,c#,.net,winforms,C#,.net,Winforms,如果您在winform上有一个禁用的按钮,您如何在鼠标上方显示工具提示以通知用户按钮禁用的原因?因此,假设您的控件名为button1,您可以执行类似操作。 您必须通过处理表单的MouseMove事件来完成,因为这些事件不会从您的控件中触发 bool IsShown = false; void Form1_MouseMove(object sender, MouseEventArgs e) { Control ctrl = this.GetChildAtPoint(e.Loca
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;
}
}此后,我对博比沙夫托的答案进行了调整,使之更为笼统 注:
- 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;
}
}
}
将按钮(或适合此场景的任何控件)放置在容器(面板、tableLayoutPanel)中,并将工具提示与相应的基础面板单元相关联。在许多场景下都能很好地工作,而且非常灵活。提示:使单元格足够大以容纳bttn,这样鼠标悬停响应(工具提示显示)就不会在bttn边界之外出现“出血”现象。每次鼠标移动都会触发此操作是否存在任何资源问题?当控件位于TabControl内时,此操作不起作用。GetChildAtPoint()返回TabControl,而不是子控件。@Petersmart:您描述的情况只有在
父控件本身有工具提示的情况下才会发生在我身上,否则@SamMackrill中的代码对我来说就行了@flixfe:如果您使用TabControl,您可以执行以下操作if(ctrl.GetType().IsInstanceOfType(typeof(TabControl)))ctrl=((TabControl)ctrl)代码>以获取当前选定的选项卡。在尝试了几个小时后,在我的情况下,我找不到令人满意的解决方案。我终于用消息框解决了我的问题。然而,我认为在某些情况下,建议的工具提示是一个优雅的解决方案。好主意,意味着您的控制计数翻了一番,嘿@SamMackrill(sry代表延迟响应,但代表子孙后代),真正的dat,但应该只适用于需要它的CTRL(通常只是几个),避免了许多不必要的代码/复杂性,使实现可视化,以便非开发人员(例如设计师)可以实现/维护。创建定制的CRTL可能有点方便,已经以这种方式配置为pkg。这是迄今为止最优雅的答案。如果需要TableLayoutPanel单元格上的工具提示,则必须在单元格中放置一个面板,然后在面板中放置控件,因为TableLayoutPanel单元格不能被引用-只能引用其包含的控件。我已将工具提示添加到包含禁用按钮的GroupBox中。这意味着每当用户将鼠标悬停在禁用按钮附近时,工具提示就会弹出,但我认为这不是问题;确保包含的面板不大于禁用的bttn。小型外观校正:在第二个if中,您可能需要添加条件&&&!ctrl.Enabled
,以便在快速切换到另一个实际处于活动状态的子控件时使其正确消失(我认为需要一个特殊的布局才能复制)。如果功能更改为禁用时仍显示工具提示,那就太好了。还有什么更好的时间来帮助用户呢!我决定让按钮保持启用状态,只显示一个msgbox来解释为什么不采取行动。大笑。
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;
}
}
}