Francis.Beauchamp Francis.Beauchamp - 13 days ago 8
C# Question

How to put a ContextMenu into the header of a TabPage

I have a custom

TabControl
in which I have
TabPages
with
ContextMenu
bound to them.

I want the menu to show up only when the page header is being clicked.

What I do is that, when the
TabControl
is clicked, I check these conditions:

private void MouseUp(object sender, MouseEventArgs e)
{
if (e.Button == Mousebuttons.Right)
{
for (int i = 0; i < TabCount; ++i)
{
Rectangle r = GetTabRect(i);
if (r.Contains(e.Location) /* && it is the header that was clicked*/)
{
// Change slected index, get the page, create contextual menu
ContextMenu cm = new ContextMenu();
// Add several items to menu
page.ContextMenu = cm;
page.ContextMenu.Show(this, e.Location);
}
}
}
}


If I bind
MouseUp
to the
TabControl
, I get the
ContextMenu
in the entire
TabPage
. If I bind it to the
TabPage
, I only get the
ContextMenu
in the body and not in the header.


Is there a way to have a ContextMenu to show up only on header Click ?

Answer

Just don't ever assign the ContextMenu to anything...simply display it:

public class MyTabControl : TabControl
{

    protected override void OnMouseUp(MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            for (int i = 0; i < TabCount; ++i)
            {
                Rectangle r = GetTabRect(i);
                if (r.Contains(e.Location) /* && it is the header that was clicked*/)
                {
                    // Change slected index, get the page, create contextual menu
                    ContextMenu cm = new ContextMenu();
                    // Add several items to menu
                    cm.MenuItems.Add("hello");
                    cm.MenuItems.Add("world!");
                    cm.Show(this, e.Location);
                    break;
                }
            }
        }
        base.OnMouseUp(e);
    }

}