2013-06-04 3 views
5

ContextMenuがバインドされたカスタムTabControlがあります。ContextMenuをTabPageのヘッダに配置する方法

ページヘッダーがクリックされているときにだけメニューが表示されるようにします。私は何

TabControlをクリックしたときに、私はこれらの条件をチェックし、ということである:私はTabControlMouseUpをバインドする場合

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

、私は全体TabPageContextMenuを取得します。私がTabPageにそれを縛ると、私は体の中でContextMenuを得て、ヘッダーではない。

ContextMenuをヘッダーにのみ表示する方法はありますか?

+0

「MouseUp」イベントは、すべての「TabPage」または「TabControl」に配線されていますか? – DonBoitnott

+0

MouseUpはTabControlに接続されています。 TabControlにワイヤリングすると、全体のタブページにContextMenuが表示されます。私はそれをTabPageにバインドする場合、私は本文ではなくヘッダーでContextMenuを取得します。 –

答えて

8

ただ、これまで単にそれを表示...何にでものContextMenuを割り当てない:

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

ちょうど好奇心で、何にContextMenuを割り当てない理由は何ですか? –

+0

割り当てられていない場合は、表示したくない場合は表示されません。実行時に動的にメニューを作成するので、どこにでも保存する必要はありません... –

2

代わりのIdle_MindようなオーバーライドはあなたにもMouseEventの上、通常のTabControlで同じことを行うことができ、言った:

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

まさに同じことが、あなたのツールボックス内の余分なコントロールを追加しません:) 複数TabControls上でそれを使用したい場合にも、それは一般的な作ることができます。

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