[VB.NET][WPF] ContextMenu(PopupMenu) の実装

2013年12月9日

 右クリックするとその場所に表示されるポップアップメニューが欲しい場合、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





カテゴリー: Program, VB.NET, WPF

Follow comments via the RSS Feed | Leave a comment | Trackback URL

コメントを投稿する

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


«   »
 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org