Share via


Cómo: Colocar un menú contextual personalizado en un control RichTextBox

En este ejemplo se muestra cómo colocar un menú contextual personalizado para un control RichTextBox.

Al implementar un menú contextual personalizado para un control RichTextBox, debe responsabilizarse de administrar la colocación del menú contextual. De manera predeterminada, un menú contextual personalizado se abre en el centro de RichTextBox.

Ejemplo

Para invalidar el comportamiento de colocación predeterminado, agregue un agente de escucha para el evento ContextMenuOpening. En el ejemplo siguiente se muestra cómo hacerlo mediante programación.

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

En el ejemplo siguiente se muestra una implementación del agente de escucha de evento ContextMenuOpening correspondiente.

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

Vea también

Conceptos

Información general sobre el control RichTextBox

Información general sobre TextBox