動的に作成するいくつかのオブジェクトにContextMenuを追加したいだけですが、次のようにランタイムでContextMenuを作成するのが唯一の方法です。
ContextMenu pMenu = new ContextMenu();
MenuItem item1 = new MenuItem();
MenuItem item2 = new MenuItem();
//I have about 10 items
//...
item1.Header = "item1";
item1.Click += new RoutedEventHandler(item1_Click);
pMenu.Items.Add(item1);
item2.Header = "item2";
item2.Click += new RoutedEventHandler(item2_Click);
pMenu.Items.Add(item2);
//and so on
それは機能しますが、WinFormsでは、ContextMenuStripコンポーネントをフォームにドロップし、アイテムやイベントをコードを記述せずに非常にすばやく定義できました。 WPFで可能ですか?
リソースでContextMenu
を定義して、必要なコントロールにバインドできます。これをチェックしてください:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
<Window.Resources>
<ContextMenu x:Key="MyContextMenu">
<MenuItem Header="Send" />
</ContextMenu>
</Window.Resources>
<Grid>
<Button Name="a_button"
ContextMenu="{StaticResource MyContextMenu}" >
</Button>
</Grid>
</Window>
さらに、メニュー項目にコマンドを配置できます...
このような:
<MenuItem Header="MyContextMenuItem
Command="{Binding Path=MyCommand}"
CommandTarget="{Binding
RelativeSource={RelativeSource FindAncestor,
AncestorType={x:Type DataGrid}}}">
別のコントロールでcontextMenuを使用する場合、CommandTargetは非常に重要です。ここでは、呼び出し元を識別するためにFindAncestorをよく使用します。
次のコードは私にとってはうまくいきます。InsertQuery/ DeleteQueryはViewModelで定義された2つのICommandメソッドです。
<DataGrid.ContextMenu>
<ContextMenu>
<MenuItem Header="Insert"
Command="{Binding DataContext.InsertQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
<MenuItem Header="Delete"
Command="{Binding DataContext.DeleteQuery, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}"/>
</ContextMenu>
</DataGrid.ContextMenu>