Замените RichTextBox's ContextMenu - PullRequest
       0

Замените RichTextBox's ContextMenu

0 голосов
/ 04 августа 2010

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

<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 Ответ

1 голос
/ 05 августа 2010

Установите для свойства ContextMenu в RichTextBox значение, отличное от null:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...