2013-06-04 20 views
5

Ho un numero personalizzato TabControl in cui sono associato TabPages con ContextMenu.Come inserire un oggetto ContextMenu nell'intestazione di una TabPage

Desidero visualizzare il menu solo quando si fa clic sull'intestazione della pagina.

Quello che faccio è che, quando il TabControl viene cliccato, verifico queste condizioni:

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

Se mi legano MouseUp al TabControl, ho l'ContextMenu in tutta la TabPage. Se lo lego allo TabPage, ottengo solo il ContextMenu nel corpo e non nell'intestazione.

C'è un modo per far apparire un ContextMenu solo sull'intestazione?

+0

L'evento 'MouseUp' è collegato a ogni' TabPage' o al 'TabControl'? – DonBoitnott

+0

MouseUp è collegato a TabControl. Se lo collego al TabControl ottengo il ContextMenu nell'intera tabpage. Se lo lego a TabPage, ottengo solo il ContextMenu nel corpo e non nell'intestazione. –

risposta

8

Basta che non bisogna mai assegnare il ContextMenu a qualsiasi cosa ... semplicemente visualizzarlo:

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

solo per curiosità, quali sono i motivi per non assegnare un ContextMenu a qualcosa? –

+0

Se non è assegnato, non può apparire quando non lo si desidera. Dal momento che stai creando il menu in modo dinamico in fase di esecuzione, non è necessario che venga memorizzato ovunque, comunque ... –

2

Invece di esclusione come Idle_Mind detto, si potrebbe anche fare lo stesso con un TabControl normale sul 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; 
       } 
      } 
     } 
    } 

fa esattamente la stessa cosa, ma non aggiunge un controllo supplementare nella vostra cassetta degli attrezzi :) si potrebbe anche rendere più generica, se si desidera utilizzare su più TabControls.

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