2013-06-04 24 views
5

Tôi có một tuỳ chỉnh TabControl trong đó tôi có TabPages với ContextMenu ràng buộc với chúng.Cách đặt ContextMenu vào tiêu đề của TabPage

Tôi muốn trình đơn hiển thị chỉ khi tiêu đề trang đang được nhấp.

Những gì tôi làm là, khi TabControl được nhấp, tôi kiểm tra các điều kiện:

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

Nếu tôi gắn MouseUp đến TabControl, tôi nhận được ContextMenu trong toàn bộ TabPage. Nếu tôi liên kết nó với số TabPage, tôi chỉ nhận được ContextMenu trong phần nội dung chứ không phải trong tiêu đề.

Có cách nào để có ContextMenu chỉ hiển thị trên tiêu đề Nhấp không?

+0

Sự kiện 'MouseUp' có được kết nối với mọi' TabPage' hoặc tới 'TabControl' không? – DonBoitnott

+0

MouseUp được kết nối với TabControl. Nếu tôi Wire nó vào TabControl tôi nhận được ContextMenu trong toàn bộ tabpage. Nếu tôi liên kết nó với TabPage, tôi chỉ nhận được ContextMenu trong phần nội dung chứ không phải trong tiêu đề. –

Trả lời

8

Chỉ cần đừng bao giờ gán ContextMenu để bất cứ điều gì ... chỉ đơn giản hiển thị nó:

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

chỉ bởi sự tò mò, lý do gì để không gán ContextMenu cho bất cứ điều gì? –

+0

Nếu nó không được gán thì nó không thể xuất hiện khi bạn không muốn nó. Vì bạn đang tạo trình đơn động tại thời gian chạy, nó không cần phải được lưu trữ ở bất kỳ đâu ... –

2

Thay vì ghi đè như Idle_Mind nói, bạn cũng có thể làm tương tự với một TabControl bình thường trên 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; 
       } 
      } 
     } 
    } 

Điều này hoàn toàn giống nhau, nhưng không thêm điều khiển thêm vào hộp công cụ của bạn :) Bạn cũng có thể làm cho nó chung nếu bạn muốn sử dụng nó trên nhiều TabControls.

private void showContextMenu_MouseClick(object sender, MouseEventArgs e) 
    { 
     if (e.Button == System.Windows.Forms.MouseButtons.Right) 
     { 
      TabControl tabControl1 = sender as TabControl; 
      [...] 
Các vấn đề liên quan