2009-10-11 4 views

Antwort

20

ich es herausgefunden:

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

Streng genommen, ist dies nicht die Antwort ist, zur Frage. Dies zeigt das Kontextmenü an der Stelle des Zeigers, nicht an einem Punkt direkt unter der Schaltfläche. –

+0

Ich bin hier angekommen und habe genau das gesucht. Vielen Dank!! –

+0

Die ContextMenu.Show() -Methode hat eine Reihe von Überladungen - in Ihrem Fall wäre eine gute Lösung diese: Sie positioniert das Kontextmenü _relative zu Ihrer Schaltfläche_. 'layoutMenus.Show (Button1, neuer Punkt (0, Button1.Height))' – AeonOfTime

1

Stellen Sie sicher, dass, wenn Sie über das Kontextmenü sind Positionierung, dass Sie es die richtigen Bildschirmkoordinaten übergeben. Sie müssen etwas wie Control.PointToScreen verwenden, indem Sie die Koordinaten x, y basierend auf der Position des Steuerelements in seinem übergeordneten Element verwenden.

33

Ich weiß, dass dies eine alte Frage, aber ich denke, dass es andere Menschen helfen kann. Der folgende Code zeigt das Kontextmenü direkt unterhalb der angeklickten Schaltfläche an und die Schaltfläche wird wie eine Dropdown-Schaltfläche aussehen.

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

das ist das Verhalten, das ich in Ihrer Lösung suche! Ich kann nicht herausfinden, wie es innerhalb der geschützten Überschreibung OnMouseClick (DataGridViewCellMouseEventArgs e) zu tun ... Ich versuche, einen ContextMenuStrip direkt unterhalb meiner DataGridViewCell zu positionieren. –

+0

@ D.Allen: Es sieht so aus, als ob Sie über die DataGridView-Klasse in .NET sprechen und das OnCellMouseClick-Ereignis in Ihrer von DataGridView geerbten Klasse überschreiben. Wenn ja, kannst du bitte beschreiben, was genau du machen willst.Ich denke, Sie können die Location, X/Y-Koordinaten aus dem DataGridViewCellMouseEventArgs-Objekt erhalten –

+0

Diese Lösung behandelt nicht einen Rand Fall, wo wir die Schaltfläche in der Nähe der Taskleiste platzieren und klicken Sie dann auf den Kontextmenüleisten anzuzeigen. Manchmal wird die Schaltfläche aufgrund eines Überlaufs im Menüstreifen ausgeblendet, während das "erwartete" Verhalten das Menü über der Schaltfläche spiegeln sollte. Aber es gibt keinen einfachen Weg, einen solchen Flip zu erreichen. –

-1

einfache Weise

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

+0

Es tut es nicht überhaupt arbeiten. –

3

Soweit ich weiß, dass der Code, den Sie benötigen hier war:

// Auf der rechten Seite der Taste

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

Am unteren Rand der Schaltfläche

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

In der unteren rechten Ecke der Schaltfläche

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

Was ist 'das' hier? Meinst du das Formular selbst? Die Berechnung funktioniert nicht und das Menü erscheint an einem unerwarteten Ort. –

1

Ich habe toolstripDropDown und nachdem ich auf toolstripDropDown geklickt habe, wollte ich das Kontextmenü anzeigen. So von obigen Kommentaren habe ich meinen Code in toolStripDropDown_Openining Ereignis wie folgt geändert. es funktioniert gut.

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 unter Taste, auf der rechten Seite der Taste ausgerichtet (expandiert nach unten drücken und nach links): ContexMenuName.Show(ButtonName, new Point(ButtonName.Width - ContexMenuName.Width, ButtonName.Height)); Hope this sb helfen :)

+0

Ich benutze @ saper_2 Lösung und es funktioniert perfekt für mich. –

Verwandte Themen