2013-06-04 16 views
5

Mam niestandardowy TabControl, w którym mam TabPages z ContextMenu związanych z nimi.Jak umieścić ContextMenu w nagłówku TabPage

Chcę, aby menu wyświetlało się tylko wtedy, gdy kliknięto nagłówek strony.

Co zrobić, jest to, że gdy TabControl kliknięciu sprawdzić te warunki:

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

Jeśli wiążę MouseUp do TabControl, otrzymuję ContextMenu w całym TabPage. Jeśli wiążę go z TabPage, otrzymam tylko ContextMenu w ciele, a nie w nagłówku.

Czy istnieje sposób, aby menu kontekstowe pokazywać tylko w nagłówku Kliknij?

+0

Czy zdarzenie 'MouseUp' jest podłączone do każdej strony" TabPage "lub do" TabControl "? – DonBoitnott

+0

The MouseUp jest podłączony do TabControl. Jeśli podłączę go do TabControl, otrzymam ContextMenu na całej zakładce. Jeśli przywiążę go do TabPage, otrzymam tylko ContextMenu w treści, a nie w nagłówku. –

Odpowiedz

8

Tylko nie zawsze przypisać ContextMenu do niczego ... po prostu go wyświetlić:

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

} 
+0

tylko z ciekawości, jakie są powody, dla których nie można przypisać ContextMenu do czegokolwiek? –

+0

Jeśli nie jest przypisany, nie może pojawić się, gdy tego nie chcesz. Ponieważ dynamicznie tworzysz menu w czasie wykonywania, to i tak nie musisz go nigdzie przechowywać ... –

2

Zamiast ręcznego jak Idle_Mind powiedział, można również zrobić to samo z normalnego TabControl na MouseEvent:

private void tabControl1_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      for (int i = 0; i < tabControl1.TabCount; ++i) 
      { 
       Rectangle r = tabControl1.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(tabControl1, e.Location); 
        break; 
       } 
      } 
     } 
    } 

robi dokładnie to samo, ale nie dodaje dodatkową kontrolę w przyborniku :) można również zrobić to generic jeśli chcesz go używać na wielu TabControls.

private void showContextMenu_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      TabControl tabControl1 = sender as TabControl; 
      [...]