2010-08-04 3 views
0

Использование .NET 4 и VS2010 Pro, я создал очень простое приложение WPF, содержащий следующий код XAML в MainWindow:Replace RichTextBox в ContextMenu

<Grid> 
    <RichTextBox x:Name="richTextBox" 
       Margin="2"/> 
</Grid> 

Все, что я хотел бы сделать, и есть до сих пор был безуспешным, заключается в том, чтобы заменить ContextMenu для RichTextBox моим собственным. Я попытался отделенного кода от MSDN не повезло:

public MainWindow() 
    { 
     InitializeComponent(); 
     richTextBox.ContextMenuOpening += new ContextMenuEventHandler(richTextBox_ContextMenuOpening); 
    } 

    private void richTextBox_ContextMenuOpening(object sender, ContextMenuEventArgs e) 
    { 
     RichTextBox rtb = sender as RichTextBox; 
     if (rtb == null) 
     { 
      return; 
     } 

     ContextMenu contextMenu = rtb.ContextMenu; 
     contextMenu.Items.Clear(); 
     MenuItem menuItem = new MenuItem(); 
     menuItem.Header = "Test"; 
     contextMenu.Items.Add(menuItem); 
     contextMenu.PlacementTarget = rtb; 
     contextMenu.Placement = PlacementMode.RelativePoint; 

     TextPointer position = rtb.Selection.End; 

     if (position == null) 
     { 
      return; 
     } 

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

     contextMenu.IsOpen = true; 
     e.Handled = true; 
    } 

Я в недоумении, что я не делаю правильно. Это связано с тем, что событие MouseDown попадает в RTB? Должен ли я получить свою версию RTB и переопределить ContextMenuOpening, чтобы заставить это работать? Это похоже на что-то очень простое, но я просто этого не вижу.

Заранее спасибо.

ответ

1

Установите свойство ContextMenu на вашем RichTextBox к чему-то другому, чем нуль:

<RichTextBox x:Name="richTextBox" 
      Margin="2"> 
    <RichTextBox.ContextMenu> 
     <ContextMenu/> 
    </RichTextBox.ContextMenu> 
</RichTextBox> 

TextBoxBase, базовый класс RichTextBox, имеет логику автоматически поставлять контекстное меню с вещами, как копировать и вставлять. Эта логика отмечает ContextMenuOpening как обработанную, поэтому ваш обработчик не вызывается. Если вы назначаете даже пустой ContextMenu на свой RichTextBox, он оставит ваш ContextMenu самостоятельно и вызовет обработчик.

Смежные вопросы