Aracılığıyla paylaş


Nasıl yapılır: RichTextBox İçinde Özel Bağlam Menüsü Konumlandırma

Bu örnekte, bir için özel bağlam menüsünün nasıl konumlandırılası gösterilmektedir RichTextBox.

RichTextBox için özel bir bağlam menüsü uyguladığınızda, bağlam menüsünün yerleşimini işlemek sizin sorumluluğunuzdadır. Varsayılan olarak, RichTextBox'ın merkezinde özel bir bağlam menüsü açılır.

ContextMenuOpening olayı için dinleyici ekleme

Varsayılan yerleştirme davranışını geçersiz kılmak için olay için ContextMenuOpening bir dinleyici ekleyin. Aşağıdaki örnek, bunun program aracılığıyla nasıl yapılacağını gösterir.

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

ContextMenuOpening olay dinleyicisinin uygulanması

Aşağıdaki örnekte, ilgili ContextMenuOpening olay dinleyicisinin bir uygulaması gösterilmektedir.

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

Ayrıca bkz.