首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C#在ToolStripItem上显示MetroFramework ToolTip

C#在ToolStripItem上显示MetroFramework ToolTip
EN

Stack Overflow用户
提问于 2021-02-10 14:07:42
回答 1查看 238关注 0票数 1

我正试着在MetroFramework上玩C#,当一个ToolStripItem被悬停时,它会显示出一个很好的ToolTip,而不是提供的基本/常规工具提示。

但是,我无法显示“每个项目”,因为ToolStripItem只有“所有者”控件属性,并且它将显示它在工具栏中的所有项目。

示例:

代码语言:javascript
复制
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库,这是不可能的吗?

非常感谢您的投入。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-10 21:45:01

基于该组件的源代码,其派生自System.Windows.Forms.ToolTip,因此我们可以以同样的方式处理它以满足这一需求。

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

要使它在每项中都有效:

  • 在设计时,设置ToolStrip / MenuStrip / ContextMenuStrip / StatusStrip项的MenuStrip属性。
  • 在构造函数或Form.Load事件中,使用递归方法获取ToolStripItem对象,以订阅ClickMouseHoverMouseLeave事件。此外,还需要ToolStripDropDownItem.DropDownOpening事件。我们会处理它们来展示和隐藏工具提示。

示例

代码语言:javascript
复制
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;
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66138476

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档