Добавление пункта меню в контекстное меню FlowDocumentReader - PullRequest
4 голосов
/ 11 февраля 2011

FlowDocumentReader имеет два пункта меню в его ContextMenu, Копировать и Выбрать все.Я хотел бы добавить дополнительный элемент MenuItem к нему и попробовал это:

    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 голосов
/ 03 апреля 2012

Вы также можете сделать это в xaml для FlowDocument :

<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>

(Заголовки удобно расположены благодаря Resx Extension Гранта Фрискена):)

Если это необходимо применить ко многим FlowDocuments, вы также можете определить его в стиле по умолчанию где-нибудь:

<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 голосов
/ 15 февраля 2011

Решение, к которому я пришел, состояло в том, чтобы просто воссоздать те MenuItems в новом меню и отменить отображение встроенного ContextMenu, которое обычно отображается.Существует несколько встроенных ApplicationCommands , которые могут быть включены в ваш собственный пользовательский ContextMenu, и реализация этого довольно проста.

Предположим, что у меня создан ContextMenu из некоторыхМетод GetContextMenu (), следующий обработчик событий, отклоняет открытие встроенного ContextMenu и заменяет тот, который был возвращен при вызове 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;
}
...