Вопрос

В приложении Windows Forms я установил свойство ContextMenuStrip для TabControl.

  1. Как я могу узнать, что пользователь нажал на вкладку, отличную от той, которая выбрана в данный момент?
  2. Как я могу запретить отображение контекстного меню только при нажатии на верхнюю часть вкладки с меткой, а не в другом месте вкладки?
Это было полезно?

Решение

Не беспокойтесь о настройке свойства contextMenuStrip в TabControl. Скорее сделайте это так. Подключитесь к событию MouseClick tabControl, а затем вручную откройте контекстное меню. Это будет срабатывать только в том случае, если нажата сама вкладка вверху, а не сама страница. Если вы щелкаете по странице, то tabControl не получает событие click, а TabPage. Некоторый код:

public Form1()
{
    InitializeComponent();
    this.tabControl1.MouseClick += new MouseEventHandler(tabControl1_MouseClick);
}

private void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        this.contextMenuStrip1.Show(this.tabControl1, e.Location);
    }


}

Другие советы

Событие открытия контекстного меню можно использовать для решения обеих проблем

private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
{            
    Point p = this.tabControl1.PointToClient(Cursor.Position);
    for (int i = 0; i < this.tabControl1.TabCount; i++)
    {
        Rectangle r = this.tabControl1.GetTabRect(i);
        if (r.Contains(p))
        {
            this.tabControl1.SelectedIndex = i; // i is the index of tab under cursor
            return;
        }
    }
    e.Cancel = true;
}

Немного поздно, но я нашел решение для первой части вашего вопроса. Вы можете выяснить, на какой вкладке щелкнули правой кнопкой мыши, отправив левой кнопкой мыши приложение. При этом выбирается вкладка, поэтому теперь вы можете использовать свойство TabControl.SelectedTab, чтобы получить вкладку, по которой пользователь щелкнул правой кнопкой мыши.

    [DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
    private static extern void mouse_event(long dwFlags, long dx, long dy, long cButtons, long dwExtraInfo);

    private const int MOUSEEVENTF_LEFTDOWN = 0x02;
    private const int MOUSEEVENTF_LEFTUP = 0x04;
    private const int MOUSEEVENTF_RIGHTDOWN = 0x08;
    private const int MOUSEEVENTF_RIGHTUP = 0x10;

    private static void SendLeftMouseClick()
    {
        int x = Cursor.Position.X;
        int y = Cursor.Position.Y;
        mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, x, y, 0, 0);
    }

    public Form1()
    {
        InitializeComponent();

        tabControl1.MouseDown += new MouseEventHandler(tabControl1_MouseDown);
        tabControl1.MouseUp += new MouseEventHandler(tabControl1_MouseUp);
    }

    void tabControl1_MouseDown(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            // Send a left mouse click to select the tab that the user clicked on.
            SendLeftMouseClick();
        }
    }

    void tabControl1_MouseUp(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            // To show a context menu for only the tab button but not the content of the tab,
            // we must show it in the tab control's mouse up event.
            contextMenuStrip1.Show((Control)sender, e.Location);
        }
    }

Я искал решение точно такой же проблемы.
После тестирования ответов @nisar и @BFree я пришел к следующему (у меня также был TabControl` внутри панели где-то в форме):

  • Создать tabcontrol1
  • Подпишитесь на событие MouseClick
  • Создать contextMenuTabs, ContextMenuStrip.


private void tabControl1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        Point ee = new Point(e.Location.X - panel1.Left, e.Location.Y - panel1.Top);
        for (int i = 0; i < this.tabControl1.TabCount; i++)
        {
            Rectangle r = this.tabControl1GetTabRect(i);
            if (r.Contains(ee))
            {
                if (this.tabControl1.SelectedIndex == i)
                    this.contextMenuTabs.Show(this.tabControl1, e.Location);
                else 
                    {
                      //if a non seelcted page was clicked we detected it here!!
                    }

                break;
            }
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top