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

C#在ToolStripItem上显示MetroFramework工具提示,c#,metroframework,C#,Metroframework,我正在尝试使用for C#,并在ToolStripItem悬停时显示一个不错的工具提示,而不是提供的基本/常规工具提示 但是,我无法“按项”显示它,因为ToolStripItem只有“Owner”控件属性,它将跨工具栏中的所有项显示它 例如: private void toolStripButton1_MouseHover(object sender, EventArgs e) { var tooltip = new MetroFramework.Components.MetroToolT

我正在尝试使用for C#,并在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库是不可能的

非常感谢您的意见。

基于此组件的功能,它源于,因此我们可以以相同的方式处理它以满足此要求

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

要使每个项目都有效,请执行以下操作:

  • 在设计时,设置
    工具条
    /
    菜单条
    /
    上下文菜单条
    /
    状态条
    项的属性

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

示例

专用只读MetroToolTip mTt;
//执行器
公共形式()
{
初始化组件();
mTt=新MetroToolTip();
//3条只是为了演示。
menuStrip1.ShowItemToolTips=false;
toolStrip1.ShowItemToolTips=false;
contextMenuStrip1.ShowItemToolTips=false;
foreach(GetAllToolStripItems(menuStrip1.Items)中的var项)
.Concat(GetAllToolStripItems(toolStrip1.Items))
.Concat(GetAllToolStripItems(contextMenuStrip1.Items)))
{
如果(!string.IsNullOrEmpty(item.ToolTipText))
{
item.AutoToolTip=false;
item.Click+=OnToolStripItemClick;
item.MouseHover+=OnToolStripItemMouseHover;
item.MouseLeave+=OnToolStripItemMouseLeave;
if(项为ToolStripDropDownItem tsddi&&tsddi.HasDropDown)
tsddi.DropDownOpen+=OnDropDownOpen;
}
}
}
//清理。。
私有void SomeForm_FormClosed(对象发送方,FormClosedEventArgs e)=>
mTt.Dispose();
//在适当的位置显示当前项的工具提示。
OlStripItemMousehover上的私有void(对象发送方,事件参数e)
{
var s=发送方作为ToolStripItem;
var p=Point.Add(Cursor.Position,新大小(0,Cursor.Size.Height));
mTt.Show(s.ToolTipText、s.Owner、s.Owner.PointToClient(p));
}
//当鼠标指针离开当前项的边界时隐藏工具提示。
private void OnToolStripItemMouseLeave(对象发送方,事件参数e)=>
mTt.Hide((发送方作为ToolStripItem.Owner);
//将要打开下拉列表时隐藏工具提示(如果有)
//否则它将保留在下拉窗口后面,直到
//内部计时器滴答作响。
私有void OnDropDownOpen(对象发送方,事件参数e)=>
mTt.Hide((发送方作为ToolStripItem.Owner);
//用于ToolStrip控件。单击项目后立即隐藏工具提示。
private void OnToolStripItemClick(对象发送方,事件参数e)=>
mTt.Hide((发送方作为ToolStripItem.Owner);
//获取任意条带的所有TSI的递归方法。
私有静态IEnumerable GetAllToolStripItems(ToolStripItemCollection tsic)
{
foreach(tsic.Cast()中的var tsi)
{
收益率;
if(tsi是ToolStripDropDownItem tsddi&&tsddi.HasDropDown)
foreach(GetAllToolStripItems(tsddi.DropDownItems)中的var ddi)
收益率;
}
}

非常棒的解决方案,非常感谢!