gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:06:29 24 4
gpt4 key购买 nike

我只想为组合框中的每个项目添加工具提示。我正在使用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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com