c#在ToolStripItem上显示MetroFramework工具提示



我正在尝试使用c#的MetroFramework,并在ToolStripItem悬停时显示一个漂亮的工具提示,而不是提供基本/常规的工具提示。

但是,我无法显示"每个项目"。因为ToolStripItem只有"owner"。控件属性,它将在工具栏中的所有项上显示它。

的例子:

private void toolStripButton1_MouseHover(object sender, EventArgs e)
{
var tooltip = new MetroFramework.Components.MetroToolTip();
ToolStripItem tsi = (ToolStripItem)sender;
tooltip.SetToolTip(tsi.Owner, "testing the tooltips");
}

有人有解决这个问题的办法吗?或者不编辑MetroFramework库是不可能的?

非常感谢您的意见。

根据该组件的源代码,它派生自System.Windows.Forms.ToolTip,因此我们可以用同样的方式处理它来满足这个要求。

首先,您只需要表单中MetroToolTip的一个实例。要么使用设计器删除实例,要么在代码中创建实例并在关闭窗体时将其丢弃。

要使每个项目都有效:

  • 在设计时设置ToolStrip/MenuStrip/ContextMenuStrip/StatusStrip项的ToolTipText属性

  • 在构造函数或Form.Load事件中,使用递归方法获取ToolStripItem对象以订阅Click,MouseHoverMouseLeave事件。此外,还需要ToolStripDropDownItem.DropDownOpening事件。我们将处理它们来显示和隐藏工具提示。

示例

private readonly MetroToolTip mTt;
// ctor
public SomeForm()
{
InitializeComponent();
mTt = new MetroToolTip();
// 3 strips just for demonstration.
menuStrip1.ShowItemToolTips = false;
toolStrip1.ShowItemToolTips = false;
contextMenuStrip1.ShowItemToolTips = false;
foreach (var item in GetAllToolStripItems(menuStrip1.Items)
.Concat(GetAllToolStripItems(toolStrip1.Items))
.Concat(GetAllToolStripItems(contextMenuStrip1.Items)))
{
if (!string.IsNullOrEmpty(item.ToolTipText))
{
item.AutoToolTip = false;
item.Click += OnToolStripItemClick;
item.MouseHover += OnToolStripItemMouseHover;
item.MouseLeave += OnToolStripItemMouseLeave;
if (item is ToolStripDropDownItem tsddi && tsddi.HasDropDown)
tsddi.DropDownOpening += OnDropDownOpening;
}
}
}
// Clean up..
private void SomeForm_FormClosed(object sender, FormClosedEventArgs e) =>
mTt.Dispose();
// Show the tooltip of the current item at a proper point.
private void OnToolStripItemMouseHover(object sender, EventArgs e)
{
var s = sender as ToolStripItem;
var p = Point.Add(Cursor.Position, new Size(0, Cursor.Size.Height));
mTt.Show(s.ToolTipText, s.Owner, s.Owner.PointToClient(p));
}
// Hide the tooltip when the mouse pointer leaves the bounds of the current item.
private void OnToolStripItemMouseLeave(object sender, EventArgs e) =>
mTt.Hide((sender as ToolStripItem).Owner);
// Hide the tooltip (if any) when a dropdown is about to open
// Otherwise it'll remain behind the dropdown window until the
// internal timer ticks.
private void OnDropDownOpening(object sender, EventArgs e) =>
mTt.Hide((sender as ToolStripItem).Owner);
// For the ToolStrip control. To hide the tooltip right after clicking an item.
private void OnToolStripItemClick(object sender, EventArgs e) =>
mTt.Hide((sender as ToolStripItem).Owner);
// A recursive method to get all the TSIs of any strip.
private static IEnumerable<ToolStripItem> GetAllToolStripItems(ToolStripItemCollection tsic)
{
foreach (var tsi in tsic.Cast<ToolStripItem>())
{
yield return tsi;
if (tsi is ToolStripDropDownItem tsddi && tsddi.HasDropDown)
foreach (var ddi in GetAllToolStripItems(tsddi.DropDownItems))
yield return ddi;
}
}

最新更新