使用.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才能使其正常工作?这似乎很简单,但我只是没有看到它。
提前致谢。
答案 0 :(得分:1)
将RichTextBox上的ContextMenu属性设置为null以外的值:
<RichTextBox x:Name="richTextBox"
Margin="2">
<RichTextBox.ContextMenu>
<ContextMenu/>
</RichTextBox.ContextMenu>
</RichTextBox>
TextBoxBase是RichTextBox的基类,它具有自动提供上下文菜单(如复制和粘贴)的逻辑。此逻辑将ContextMenuOpening标记为已处理,因此不会调用您的处理程序。如果您将一个空的ContextMenu分配给RichTextBox,它将单独保留ContextMenu并调用您的处理程序。