在FlowDocumentReader上下文菜单中添加菜单项

4

FlowDocumentReader的上下文菜单中有两个菜单项,复制和全选。我想要添加一个额外的菜单项,并尝试了以下方法:

    private void FlowDocumentReader_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        flowDocumentReader.ContextMenu.Items.Clear();
        MenuItem menuItem = new MenuItem();
        menuItem.Header = "Test";
        flowDocumentReader.ContextMenu.Items.Add(menuItem);
    }

此外,我也尝试了以下方法:
    private void FlowDocumentReader_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        MenuItem menuItem = new MenuItem();
        menuItem.Header = "Test";
        flowDocumentReader.ContextMenu.Items.Add(menuItem);
    }

当我尝试清除上下文菜单中的项目并尝试添加它时,都无法正常工作。

我可以像这样创建自己的菜单:

    private void FlowDocumentReader_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        MenuItem menuItem = new MenuItem();
        menuItem.Header = "Test";
        flowDocumentReader.ContextMenu.Items.Add(menuItem);
        e.Handled = true;
        ContextMenu menu = new ContextMenu();
        MenuItem a = new MenuItem();
        a.Header = "A";
        menu.Items.Add(a);
        MenuItem b = new MenuItem();
        b.Header = "B";
        menu.Items.Add(b);
        flowDocumentReader.ContextMenu.Items.Clear();
        flowDocumentReader.ContextMenu = menu;
        menu.IsOpen = true;
    }

这样会显示出来,但我希望也能有复制和全选菜单项,以及 A 和 B。

有什么好的想法吗?

2个回答

6
您也可以在 FlowDocument 的 xaml 中实现此操作:
<FlowDocument.ContextMenu>
     <ContextMenu>
          <MenuItem Header="{Resx Copy}" Command="Copy"/>
          <MenuItem Header="{Resx SelectAll}" Command="SelectAll"/>
          <MenuItem Header="{Resx CustomCommand}" Command="{Binding CustomCommand}"/>
     </ContextMenu>
</FlowDocument.ContextMenu>

(感谢Grant Frisken的Resx扩展方便地本地化了标题) :)

如果需要应用到多个FlowDocument中,您也可以在某个默认样式中定义它:

<Style TargetType="FlowDocument">
    <Setter Property="ContextMenu">
         <Setter.Value>
              <ContextMenu>
                  <MenuItem Header="{Resx Copy}" Command="Copy"/>
                  <MenuItem Header="{Resx SelectAll}" Command="SelectAll"/>
                  <MenuItem Header="{Resx CustomCommand}" Command="{Binding CustomCommand}"/>
              </ContextMenu>
         </Setter.Value>
    </Setter>
</Style>

0
我想到的解决方案是在新菜单上重新创建那些菜单项,并取消通常显示的内置上下文菜单的显示。有许多内置的ApplicationCommands可以并入自定义上下文菜单中,实现起来非常简单。
假设我已经从某个方法GetContextMenu()创建了一个上下文菜单,以下事件处理程序拒绝打开内置上下文菜单,并替换为从调用GetContextMenu()返回的菜单,并添加复制命令(选择所有类似)。
private void flowDocumentReader_ContextMenuOpening(object sender, ContextMenuEventArgs e)
{
   e.Handled = true;  // keeps the built-in one from opening
   ContextMenu myMenu = GetContextMenu();
   MenuItem copyMenuItem = new MenuItem();
   copyMenuItem.Command = ApplicationCommand.Copy;
   copyMenuItem.CommandTarget = myFlowDocument;
   myMenu.Items.Add(copyMenuItem);
   ShowMenu(myMenu);
}

private void ShowMenu(ContextMenu menu)
{
   menu.Placement = PlacementMode.MousePoint;
   menu.PlacementRectangle = new Rect(0.0, 0.0, 0.0, 0.0);
   menu.IsOpen = true;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接