替换RichTextBox的ContextMenu

时间:2010-08-04 18:34:34

标签: wpf

使用.NET 4和VS2010 Pro,我创建了一个非常简单的WPF应用程序,它在MainWindow中包含以下XAML:

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

我想做的所有事情,到目前为止都没有成功,是用我自己的RichTextBox替换ContextMenu。我从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;
    }

我因为我做得不对而感到茫然。它是否必须与RTB捕获MouseDown事件?我是否必须派生自己的RTB版本并覆盖ContextMenuOpening才能使其正常工作?这似乎很简单,但我只是没有看到它。

提前致谢。

1 个答案:

答案 0 :(得分:1)

将RichTextBox上的ContextMenu属性设置为null以外的值:

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

TextBoxBase是RichTextBox的基类,它具有自动提供上下文菜单(如复制和粘贴)的逻辑。此逻辑将ContextMenuOpening标记为已处理,因此不会调用您的处理程序。如果您将一个空的ContextMenu分配给RichTextBox,它将单独保留ContextMenu并调用您的处理程序。