【问题标题】:Can someone help me identify why C# tooltips show when they shouldn't?有人可以帮我确定为什么 C# 工具提示不应该显示吗?
【发布时间】:2011-05-31 18:10:51
【问题描述】:

我有在 C# 表单上运行的工具提示,并且我有一个复选框来禁用它们的显示。

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (checkBox1.Checked)
    {
        Tool_Tips = false;
    }
    else
        Tool_Tips = true;
}

其中Tool_Tips 是一个全局公共布尔值。

每次我将鼠标悬停在按钮上时,我都会使用代码:

private void Edge_Down_B_MouseHover(object sender, EventArgs e)
{
    if (Tool_Tips)
    {
        Tool_Tip(Tool_Help.Edge_Down, Edge_Down_B);
    }
}

我的问题是我有 30 个按钮中的 4 个按钮,无论布尔值如何,它们都会显示工具提示。如果我在他们的代码中放置一个断点,它可以正常工作,但是如果我删除断点,他们的工具提示会在它不应该出现的时候出现。我做了发布模式的干净构建,重建了项目并尝试了调试模式,当他们不应该时,他们继续显示工具提示。

我什至将这 4 个按钮的代码更改为如下所示:

private void BlackandWhite_B_MouseHover(object sender, EventArgs e)
{
    if (Tool_Tips)
    {
        if (!checkBox1.Checked)
            Tool_Tip(Tool_Help.BlackWhite, BlackandWhite_B);
    }
}

并且它们仍然以正常运行模式显示。如果我在其中放置断点,它们将不会出现。

谁能告诉我为什么?

编辑: 如果我运行我的程序,它将从禁用工具提示开始,并选中复选框。我将取消选中该框,我将看到工具提示。如果我重新选中该框以禁用工具提示,即使它们被禁用,我查看过的工具提示仍会显示。

【问题讨论】:

  • 您确定这不仅仅是上次设置时的后遗症(在您清除复选框之前)? IIRC 许多工具提示都存储在一个键控集合中。如果你不清除它,它们仍然被设置。
  • 我不确定。我有我所有的鼠标悬停调用 Tool_Tip() 这是我创建的一个函数: public void Tool_Tip(string help, Button bt) { if (Tool_Tips) { ToolTip Tip = new ToolTip(); Tip.ReshowDelay = 0; Tip.InitialDelay = 0;提示.AutoPopDelay = 0; Tip.AutomaticDelay = 0; Tip.Show(帮助, bt, 3000); } } 这就是实际的展示。 30 一些按钮调用了这个,只有 ~4 有问题
  • 我添加了 Tip.Dispose();提示.RemoveAll();在 Tip.Show() 之后并没有阻止它们。

标签: c# winforms tooltip


【解决方案1】:

首先,确保这 4 个按钮的 Click 上没有附加任何其他事件处理程序。

然后尝试将您的方法更改为:

    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        Application.DoEvents();
        Tool_Tips  = !checkBox1.Checked;
    }

事件可能在复选框被选中之前被触发。

如果这也不起作用,请在 Tool_Tip 方法中写入:

if (checkbox1.Checked) return;

如果这些都没有帮助,请朝我的脑袋开枪:D!

在射击我之前,请执行以下操作: 在调试模式下禁用(或删除)所有断点并将一个仅放在 Tool_Tip 方法的第一行中。

让错误出现并命中你的断点。 然后从调试菜单中,打开调用堆栈并检查调用方法的位置。这可能会导致您遇到问题,因为我认为您的方法是从不需要的代码点调用的。

【讨论】:

  • 即使在我注释掉我的旧代码并设置 Tool_Tips = !checkBox1.checked 后它仍然在执行此操作。我在 if(checkBox1.checked)return 中添加了;但我没有枪:P
  • 它必须在某个地方记住它。如果我设置断点,它可以正常工作,但只是在调试或发布中运行它,它们仍然会显示
  • 启动时复选框设置为选中,这意味着没有工具提示。没有工具提示出现。如果我取消选中该框,则会出现工具提示,到目前为止是正确的。如果我然后重新选中该框,则 Tool_Tips 变量为 false,那就是它错误地显示内容
  • 你添加Application.DoEvents();了吗?
  • 是的,我做到了。私人无效checkBox1_CheckedChanged(对象发送者,EventArgs e){Application.DoEvents(); Tool_Tips = !checkBox1.Checked; //if (checkBox1.Checked) //{ // Tool_Tips = false; //} //else // Tool_Tips = true;我注释掉了我的旧代码并将新代码放在它上面
猜你喜欢
  • 1970-01-01
  • 2017-05-28
  • 2017-04-20
  • 1970-01-01
  • 2020-12-25
  • 2022-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多