Frage

In einem Windows Forms-Anwendung ich die Context Eigenschaft auf einem TabControl.

  1. Wie kann ich sagen, der Benutzer eine Registerkarte geklickt andere dann derjenige, der gerade ausgewählt ist?
  2. Wie kann ich das Kontextmenü beschränken nur zeigt, wenn der obere Teil Tab mit dem Etikett angeklickt wird, und nicht an anderer Stelle in der Registerkarte?
War es hilfreich?

Lösung

Stören Sie nicht die Context Eigenschaft auf dem TabControl Einstellung. Vielmehr macht diese Art und Weise es. Schalen auf den Mouseclick-Ereignis des TabControl, und dann zeigen, manuell über das Kontextmenü. Dies wird nur dann ausgelöst, wenn die Reiter selbst auf geklickt wird, nicht auf die aktuelle Seite. Wenn Sie auf der Seite klicken, dann wird der tabcontrol nicht das Click-Ereignis erhält, hat die TabPage. Einige Code:

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);
    }


}

Andere Tipps

Eröffnungsveranstaltung von Kontextmenü verwendet werden kann, beiden Probleme zu lösen

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;
}

Ein bisschen spät, aber ich habe eine Lösung für den ersten Teil Ihrer Frage gefunden. Sie können herausfinden, welche Registerkarte rechts geklickt wurde auf durch einen linken Mausklick auf die Anwendung zu senden. Damit wird die Registerkarte, so können Sie jetzt die TabControl.SelectedTab Eigenschaft verwenden, um die Registerkarte zu erhalten, die der Benutzer mit rechts geklickt auf.

    [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);
        }
    }

Ich war auf der Suche nach einer Lösung für das exakt gleiche Problem.
beide @nisar und @BFree Antworten Nach der Prüfung ich dazu kam (ich hatte auch die TabControl` innerhalb eines Panel irgendwo in der Form):

  • Erstellen TabControl1
  • Melden Sie sich an das Mouseclick-Ereignis
  • Erstellen contextMenuTabs, Context


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;
            }
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top