Gewusst wie: Positionieren eines benutzerdefinierten Kontextmenüs in einem "RichTextBox"-Element

Aktualisiert: November 2007

Dieses Beispiel zeigt, wie Sie für ein RichTextBox-Element ein benutzerdefiniertes Kontextmenü positionieren.

Wenn Sie für ein RichTextBox-Element ein benutzerdefiniertes Kontextmenü definieren, sind Sie für die Behandlung der Positionierung dieses Kontextmenüs verantwortlich. Standardmäßig wird ein benutzerdefiniertes Kontextmenü im RichTextBox-Element zentriert geöffnet.

Ein Arbeitsbeispiel, in dem dies gezeigt wird, finden Sie unter Beispiel zum Positionieren eines benutzerdefinierten Kontextmenüs in einer RichTextBox.

Beispiel

Um das standardmäßige Positionierungsverhalten zu überschreiben, fügen Sie für das ContextMenuOpening-Ereignis einen Listener hinzu. Das folgende Beispiel zeigt, wie Sie dies programmgesteuert erreichen.

richTextBox.ContextMenuOpening += new ContextMenuEventHandler(richTextBox_ContextMenuOpening);

Das folgende Beispiel zeigt eine Implementierung des entsprechenden ContextMenuOpening-Ereignislisteners.

// This method is intended to listen for the ContextMenuOpening event from a RichTextBox.
// It will position the custom context menu at the end of the current selection.
void richTextBox_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
    // Sender must be RichTextBox.
    RichTextBox rtb = sender as RichTextBox;
    if (rtb == null) return;

    ContextMenu contextMenu = rtb.ContextMenu;
    contextMenu.PlacementTarget = rtb;

    // This uses HorizontalOffset and VerticalOffset properties to position the menu,
    // relative to the upper left corner of the parent element (RichTextBox in this case).
    contextMenu.Placement = PlacementMode.RelativePoint;

    // Compute horizontal and vertical offsets to place the menu relative to selection end.
    TextPointer position = rtb.Selection.End;

    if (position == null) return;

    Rect positionRect = position.GetCharacterRect(LogicalDirection.Forward);
    contextMenu.HorizontalOffset = positionRect.X;
    contextMenu.VerticalOffset = positionRect.Y;

    // Finally, mark the event has handled.
    contextMenu.IsOpen = true;
    e.Handled = true;
}

Siehe auch

Konzepte

Übersicht über RichTextBox

Übersicht über TextBox