.net - 组合框中每个项目的工具提示

标签 .net winforms combobox tooltip

我只想为组合框中的每个项目添加工具提示。我正在使用C#.net Windows应用程序。

没有像这样的选择

combobox.items [1] .tooltip();

有什么方法可以添加工具提示吗?

最佳答案

对于这个问题,实际上有一些合理的解决方案。一个MSDN论坛的ComboBox Item highlight event帖子包含两种可能性,
一个来自nobugz,另一个来自agrobler。它们中的每一个都提供了用于子类化ComboBox的代码,该代码应该处理ComboBox下拉列表中各个项目的工具提示。 Agrobler的解决方案看起来更加优美,因为他/她甚至提供了一些精美的插图,但不幸的是(至少对我而言)不清楚如何填充控件的关键ToolTipMember属性。

这两种解决方案似乎都允许将任意工具提示分配给各个项目。一个更具体但更常见的情况是,当您知道您的项目可能太长而无法适合ComboBox的宽度时,您只是希望工具提示能够反射(reflect)该项目的文本。就我自己而言,我有一个ComboBox的实例,该实例包含完整的文件路径,因此很容易看到内容可能超出ComboBox的宽度。

在MSDN论坛上的Windows Dropdown question帖子中,叶志新提供了一种解决方案,可以解决这个更具体的问题,并且更加简单。我在这里完整地复制代码。 (请注意,此代码假设您已经创建了一个名为Form1的Form并连接了所示的加载处理程序,还添加了一个名为comboBox1的ComboBox和一个工具提示处理程序toolTip1。)

private void Form1_Load(object sender, EventArgs e)
{
    this.comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
    this.comboBox1.DrawItem += new DrawItemEventHandler(comboBox1_DrawItem);
}

void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    string text = this.comboBox1.GetItemText(comboBox1.Items[e.Index]);
    e.DrawBackground();
    using (SolidBrush br = new SolidBrush(e.ForeColor))
    { e.Graphics.DrawString(text, e.Font, br, e.Bounds); }

    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
    { this.toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
    else { this.toolTip1.Hide(comboBox1); }
    e.DrawFocusRectangle();
}

尽管简洁明了,但此代码确实存在一个缺陷(如上述MSDN线程的答复中所指出):当您将​​鼠标(不单击)从一个下拉菜单项移至另一个下拉菜单项时,只有其他项显示一个持续的工具提示!该修补程序仅由该线程上的另一个条目提示,因此我认为在此处提供完整的,更正的代码将很有用:
private void Form1_Load(object sender, EventArgs e)
{
    comboBox1.DrawMode = DrawMode.OwnerDrawFixed;
    comboBox1.DrawItem += comboBox1_DrawItem;
    comboBox1.DropDownClosed += comboBox1_DropDownClosed;
}

private void comboBox1_DropDownClosed(object sender, EventArgs e)
{
    toolTip1.Hide(comboBox1);
}

private void comboBox1_DrawItem(object sender, DrawItemEventArgs e)
{
    if (e.Index < 0) { return; } // added this line thanks to Andrew's comment
    string text = comboBox1.GetItemText(comboBox1.Items[e.Index]);
    e.DrawBackground();
    using (SolidBrush br = new SolidBrush(e.ForeColor))
    { e.Graphics.DrawString(text, e.Font, br, e.Bounds); }
    if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
    { toolTip1.Show(text, comboBox1, e.Bounds.Right, e.Bounds.Bottom); }
    e.DrawFocusRectangle();
}

除了删除代码的一些冗余部分(例如“this”限定符)外,主要区别在于将toolTip1.Hide调用移至DropDownClosed事件处理程序中。从DrawItem处理程序中删除它可以消除上述缺陷;但是您需要在下拉菜单关闭时将其关闭,否则最后显示的工具提示将保留在屏幕上。

2012.07.31附录

只是想提一下,此后我创建了一个包含此工具提示功能的复合ComboBox,因此,如果您使用我的库,则根本无需编写任何代码。只需将ComboBoxWithTooltip拖到Visual Studio设计器上即可。深入到我的API page或我的开源C#库的download上的ComboBoxWithTooltip入门。 (请注意,Andrew捕获的错误的修补程序将在1.1.04版中发布,即将发布。)

关于.net - 组合框中每个项目的工具提示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/680373/

相关文章:

c# - 当鼠标进入 WPF ComboBox 下拉列表时防止滚动

javascript - 扩展后EXTJS Combobox不按valueField选择

c# - 自定义组合框样式

c# - 获取一周第一个星期一的日期?

c# - 获取 NpgSql Entity Framework 查询文本

c# - 仅供外部访问的方法?

c# - 使用C#产生一个范围内的随机数

c# - 我如何确定哪个按钮调用了事件处理程序?

winforms - 如何为不懂计算机的人实现 UI?

c# - 我应该为每个 Paint 请求创建新的 Pens/Brush 还是在整个应用程序生命周期中保留它们?