Практическое руководство. Расположение пользовательского контекстного меню в RichTextBox
В этом примере показано, как расположение пользовательского контекстного меню для RichTextBox.
При реализации пользовательского контекстного меню для RichTextBox вы несете ответственность за обработку размещения контекстного меню. По умолчанию пользовательское контекстное меню открывается в центре RichTextBox.
Пример
Чтобы переопределить поведение расположения по умолчанию, добавьте прослушиватель для ContextMenuOpening событий. В приведенном ниже примере показано, как это сделать программным способом.
richTextBox.ContextMenuOpening += new ContextMenuEventHandler(richTextBox_ContextMenuOpening);
Пример
В следующем примере показана реализация соответствующего 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;
}