首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >向FlowDocumentReader ContextMenu添加菜单项

向FlowDocumentReader ContextMenu添加菜单项
EN

Stack Overflow用户
提问于 2011-02-11 11:50:50
回答 2查看 1.3K关注 0票数 4

FlowDocumentReader的ContextMenu中有两个菜单项:“复制”和“全选”。我想给它添加一个额外的MenuItem,并且已经尝试过了:

代码语言:javascript
复制
    private void FlowDocumentReader_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        flowDocumentReader.ContextMenu.Items.Clear();
        MenuItem menuItem = new MenuItem();
        menuItem.Header = "Test";
        flowDocumentReader.ContextMenu.Items.Add(menuItem);
    }

此外,我还尝试了以下内容:

代码语言:javascript
复制
    private void FlowDocumentReader_ContextMenuOpening(object sender, ContextMenuEventArgs e)
    {
        MenuItem menuItem = new MenuItem();
        menuItem.Header = "Test";
        flowDocumentReader.ContextMenu.Items.Add(menuItem);
    }

其中,我没有清除上下文菜单中的项,并尝试将其追加。这两种方法都不起作用。

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

代码语言:javascript
复制
    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。

想法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-02-15 21:25:58

我得到的解决方案是简单地在新菜单上重新创建这些MenuItems,并取消通常显示的内置ContextMenu的显示。有许多内置的ApplicationCommands可以合并到您自己的自定义ContextMenu中,并且实现起来非常简单。

假设我有一个从某个方法GetContextMenu()创建的ContextMenu,下面的事件处理程序拒绝打开内置的ContextMenu,代之以调用GetContextMenu()返回的ContextMenu,并添加复制命令(Select All与此类似)。

代码语言:javascript
复制
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;
}
票数 0
EN

Stack Overflow用户

发布于 2012-04-03 10:13:35

也可以在FlowDocument的xaml中执行此操作。

代码语言:javascript
复制
<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 Extension,标题可以方便地本地化) :)

如果需要将其应用于许多FlowDocuments,您还可以在某个地方以默认样式定义它:

代码语言:javascript
复制
<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>
票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4965458

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档