2009-10-11 6 views

Trả lời

20

I figured it out:

layoutMenus.Show(Cursor.Position.X, Cursor.Position.Y); 
+5

Nói đúng ra, đây không phải là câu trả lời cho câu hỏi. Điều này sẽ hiển thị menu ngữ cảnh tại vị trí của con trỏ, không phải ở một điểm ngay bên dưới nút. –

+0

Tôi đến đây để tìm chính xác điều này. Cảm ơn bạn!! –

+0

Phương thức ContextMenu.Show() có một số tình trạng quá tải - trong trường hợp của bạn, một giải pháp tốt sẽ là giải pháp này: Nó định vị trình đơn ngữ cảnh liên quan đến button_ của bạn. 'layoutMenus.Show (Button1, điểm mới (0, Button1.Height))' – AeonOfTime

1

Hãy chắc chắn rằng khi bạn đang định vị menu ngữ cảnh mà bạn vượt qua nó tọa độ màn hình chính xác. Bạn sẽ cần phải sử dụng một cái gì đó như Control.PointToScreen, sử dụng x, y, tọa độ dựa trên vị trí của điều khiển trong cha mẹ của nó.

33

Tôi biết đây là một câu hỏi cũ nhưng tôi nghĩ rằng nó có thể giúp những người khác. Đoạn mã sau sẽ hiển thị menu ngữ cảnh ngay bên dưới nút đang được nhấp và nút sẽ trông giống như một nút thả xuống.

private void Button1_Click(object sender, EventArgs e) 
{ 
    Button btnSender = (Button)sender; 
    Point ptLowerLeft = new Point(0, btnSender.Height); 
    ptLowerLeft = btnSender.PointToScreen(ptLowerLeft);   
    ctMenuStrip.Show(ptLowerLeft); 
} 
+0

đây là hành vi mà tôi đang tìm kiếm trong giải pháp của bạn! Tôi không thể tìm ra cách để làm điều đó trong bảo vệ ghi đè OnMouseClick (DataGridViewCellMouseEventArgs e) ... Tôi đang cố gắng để vị trí một ContextMenuStrip ngay bên dưới dataGridViewCell của tôi. –

+0

@ D.Allen: Dường như bạn đang nói về lớp DataGridView trong .NET và bạn đang ghi đè sự kiện OnCellMouseClick trong lớp của bạn được kế thừa từ DataGridView. Nếu vậy thì bạn có thể vui lòng mô tả chính xác bạn muốn làm gì không.Tôi nghĩ rằng bạn có thể có được vị trí, X/Y tọa độ từ các đối tượng DataGridViewCellMouseEventArgs –

+0

Giải pháp này không bao gồm một trường hợp cạnh nơi chúng tôi đặt nút gần thanh tác vụ và sau đó nhấp vào nó để hiển thị dải menu ngữ cảnh. Đôi khi dải trình đơn sẽ ẩn nút do tràn, trong khi hành vi 'mong đợi' sẽ được lật lên trình đơn, sau đó phía trên nút. Nhưng không có cách nào dễ dàng để đạt được như vậy một flip. –

-1

Cách dễ dàng

contextMenuStrip1.Show (Button1, Button1.PointToClient (Cursor.Position));

+0

Nó không làm việc chút nào. –

3

Theo như tôi biết mã bạn yêu cầu đã ở đây:

// Trên bên phải của nút

ContextMenuName.Show(ButtonName.Left + ButtonName.Width + this.Left, ButtonName.Top + this.Top); 

Ở dưới cùng của nút

ContextMenuName.Show(ButtonName.Left + this.Left, ButtonName.Top + ButtonName.Height + this.Top); 

Ở dưới cùng bên phải của nút

ContextMenuName.Show(ButtonName.Left + ButtonName.Width + this.Left, ButtonName.Top + ButtonName.Height + this.Top); 
+0

'Cái này' ở đây là gì? Bạn có nghĩa là hình thức chính nó? Tính toán không hoạt động và menu xuất hiện ở vị trí không mong muốn. –

1

Tôi đang có toolstripDropDown và sau khi nhấp vào nút toolstripDropDown tôi muốn hiển thị menu ngữ cảnh. Vì vậy, từ các ý kiến ​​trên tôi đã sửa đổi mã của tôi trong sự kiện toolStripDropDown_Openining như sau. nó hoạt động tốt.

void toolStripDropDownButton_DropDownOpening(object sender, EventArgs e) 
    { 


      ToolStripDropDownButton btnSender = (ToolStripDropDownButton)sender; 
      Point ptLowerRight = new Point(btnSender.Bounds.Right, btnSender.Bounds.Bottom); 
      ptLowerRight = PointToScreen(ptLowerRight); 
      contextMenuStrip.Show(ptLowerRight); 
    } 
4

ContexMenuName dưới nút, liên kết về phía bên phải nút (mở rộng tới nút bên dưới và bên trái): ContexMenuName.Show(ButtonName, new Point(ButtonName.Width - ContexMenuName.Width, ButtonName.Height)); Hy vọng điều này sẽ giúp sb :)

+0

Tôi đang sử dụng giải pháp @ saper_2 và nó hoạt động hoàn toàn tốt cho tôi. –