Comment : positionner un menu contextuel personnalisé dans un RichTextBox

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

Lorsque vous implémentez un menu contextuel personnalisé pour un RichTextBox, il vous appartient de gérer le positionnement du menu contextuel. Par défaut, un menu contextuel personnalisé s’ouvre au centre du RichTextBox.

Ajouter un écouteur pour l’événement ContextMenuOpening

Pour remplacer le comportement de placement par défaut, ajoutez un écouteur pour l’événement ContextMenuOpening . L’exemple suivant montre comment procéder par programme.

richTextBox.ContextMenuOpening += new ContextMenuEventHandler(richTextBox_ContextMenuOpening);
AddHandler richTextBox.ContextMenuOpening, AddressOf richTextBox_ContextMenuOpening

Implémentation de l’écouteur d’événements ContextMenuOpening

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

// 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;
}
' 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.
Private Sub richTextBox_ContextMenuOpening(ByVal sender As Object, ByVal e As ContextMenuEventArgs)
    ' Sender must be RichTextBox.
    Dim rtb As RichTextBox = TryCast(sender, RichTextBox)
    If rtb Is Nothing Then
        Return
    End If

    Dim contextMenu As 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.
    Dim position As TextPointer = rtb.Selection.End

    If position Is Nothing Then
        Return
    End If

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

    ' Finally, mark the event has handled.
    contextMenu.IsOpen = True
    e.Handled = True
End Sub

Voir aussi