Search code examples
c#.netformstooltipmenustrip

"Tool tip" covered by ToolStripItems if they have dropdown items?


In Windows Forms - if the dropdown items of a MenuStrip has tooltips and dropdown items themselves the tooltip will have about a 50% chance of showing up below the ToolStripItems.

What is the workaround?

To repro you can create the MenuStrip in Visual Studio or just add the following code to a form and then try to hover your mouse over the menu items to get a tooltip:

        //Make a menu strip
        MenuStrip menu = new MenuStrip();            
        this.Controls.Add(menu);

        //Add category "File"
        ToolStripMenuItem fileItem = new ToolStripMenuItem("File");
        menu.Items.Add(fileItem);

        //Add items
        for (int i = 0; i < 10; i++)
        {
            ToolStripMenuItem item = new ToolStripMenuItem("item");
            item.ToolTipText = "item tooltip";
            item.DropDownItems.Add("sub item");

            fileItem.DropDownItems.Add(item);
        }

I am using .NET 3.5


Solution

  • Try this code

    //Make a menu strip
    MenuStrip menu = new MenuStrip();
    this.Controls.Add(menu);
    
    //Add category "File"
    ToolStripMenuItem fileItem = new ToolStripMenuItem("File");
    menu.Items.Add(fileItem);
    
    this.toolTip = new ToolTip();
    this.toolTip.AutoPopDelay = 0;
    this.toolTip.AutomaticDelay = 0;
    this.toolTip.UseAnimation = true;
    
    //Add items
    for (int i = 0; i < 10; i++)
    {
        ToolStripMenuItem item = new ToolStripMenuItem("item");
    
        //disable the default tool tip of ToolStripMenuItem
        item.AutoToolTip = false;
    
        //instead, use Tooltip class to show to text when mouse hovers the item
        item.MouseHover += new EventHandler(item_MouseHover);
        item.DropDownItems.Add("sub item");
    
        fileItem.DropDownItems.Add(item);
    }
    
    void item_MouseHover(object sender, EventArgs e)
    {
        ToolStripMenuItem mItem = (ToolStripMenuItem)sender;
        toolTip.Show("tool tip", mItem.Owner, 1500);
    }