Como: Posicionar um Menu de Contexto em uma CaixaTextoRica
Este exemplo mostra como posicionar um menu de contexto personalizado para uma RichTextBox.
Quando você implementa um menu de contexto personalizado para uma CaixaTextoRica, você é responsável por lidar com o posicionamento do menu de contexto. Por padrão, um menu de contexto personalizado é aberto no centro da CaixaTextoLivre.
Para uma amostra funcionando que demonstra este exemplo, consulte Posição um menu de contexto Personalizar em um exemplo de RichTextBox.
Exemplo
Para substituir o comportamento do posicionamento padrão, adicione uma escuta para o evento ContextMenuOpening. O seguinte exemplo mostra como fazê-lo programaticamente.
richTextBox.ContextMenuOpening += new ContextMenuEventHandler(richTextBox_ContextMenuOpening);
O seguinte exemplo mostra uma implementação da escuta de evento ContextMenuOpening correspondente.
// 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;
}