4

FlowDocumentReader の ContextMenu には、Copy と Select All の 2 つのメニュー項目があります。それに追加の 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 です。

アイデア?

4

2 に答える 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 Extensionのおかげで便利にローカライズされています) :)

これを多数の 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>
于 2012-04-03T02:13:34.970 に答える
0

私がたどり着いた解決策は、新しいメニューでこれらの MenuItem を単純に再作成し、通常は表示される組み込みの ContextMenu の表示をキャンセルすることでした。独自のカスタム ContextMenu に組み込むことができる組み込みのApplicationCommandsが多数あり、これの実装は非常に簡単です。

何らかのメソッド GetContextMenu() から作成された ContextMenu があると仮定すると、次のイベント ハンドラーは組み込みの ContextMenu を開くことを拒否し、GetContextMenu() への呼び出しから返されたものを代用し、Copy コマンド (Selectすべてが似ています)。

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;
}
于 2011-02-15T13:25:57.703 に答える