右クリックするとその場所に表示されるポップアップメニューが欲しい場合、ContextMenu を実装することで実現できます。
実装例は以下。
<Window x:Class="MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Window.Resources> <ContextMenu x:Key="Menu1" FontSize="32"> <MenuItem Header="MenuItem1" Click="MenuItem1_Click" /> <MenuItem Header="MenuItem2"> <MenuItem Header="MenuItem21" Click="MenuItem21_Click" /> <MenuItem Header="MenuItem22" Click="MenuItem22_Click" /> </MenuItem> </ContextMenu> </Window.Resources> <StackPanel> <Button Content="A" ContextMenu="{StaticResource Menu1}" /> <Button Content="B" ContextMenu="{StaticResource Menu1}" /> <Button Content="C" ContextMenu="{StaticResource Menu1}" /> </StackPanel> </Window>
上記は、複数のコントロールで同じメニューを使う、というのを前提にしたので、ContextMenu の定義は Resources に定義しています。
フォントやフォントサイズも変えられるようです。
また、上記の定義で右クリックすると ContextMenu が表示されますが、プログラムによってメニューを表示したいという場合は、たとえば以下のコードで実現できます。(ContextMenu の IsOpen を True にする)
' ボタンの ContextMenu を経由して表示 Private Sub ButtonA_Click(sender As Object, e As RoutedEventArgs) Dim b = DirectCast(sender, Button) b.ContextMenu.IsOpen = True End Sub ' 直接 Resources を参照して表示 Private Sub ButtonB_Click(sender As Object, e As RoutedEventArgs) Dim c = DirectCast(Me.Resources("Menu1"), ContextMenu) c.IsOpen = True End Sub