Share via


Comment : positionner un menu contextuel personnalisé dans un RichTextBox

Mise à jour : novembre 2007

Cet exemple indique comment positionner un menu contextuel personnalisé pour un RichTextBox.

Lorsque vous implémentez un menu contextuel personnalisé pour un RichTextBox, vous êtes chargé de gérer le positionnement du menu contextuel. Par défaut, un menu contextuel personnalisé s'ouvre au centre du RichTextBox.

Pour un exemple pratique à ce sujet, consultez Positionner un menu contextuel personnalisé dans un RichTextBox, exemple.

Exemple

Pour substituer le comportement de positionnement par défaut, ajoutez un écouteur pour l'événement ContextMenuOpening. L'exemple suivant indique comment effectuer cette opération par programme.

richTextBox.ContextMenuOpening += new ContextMenuEventHandler(richTextBox_ContextMenuOpening);

L'exemple suivant montre une implémentation de l'écouteur d'événements ContextMenuOpening correspondant.

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

Voir aussi

Concepts

Vue d'ensemble de RichTextBox

Vue d'ensemble de TextBox