2011-02-11 21 views
3

FlowDocumentReaderには、ContextMenuのCopyとSelect Allという2つのメニュー項目があります。私はそれに追加のMenuItemを追加したいと、これを試してみました:FlowDocumentReaderにメニュー項目を追加するContextMenu

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を選択します

アイデア?

答えて

0

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

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

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; 
} 
5

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

(ヘッダは便利付与するおかげで、ローカライズFriskenの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> 
関連する問題