2015年10月10日土曜日

VB WPF お勉強 07 Window に ContextMenu を

Form の時も、マウス右クリックで表示される ContextMenu はあまり実装しませんでした、 私。
でも、あると便利なのですよね。  そこで、雛形を作ってありました。  そして、偶には、利用していました。.
さて、これを、WPF で書くとなると ... 。
まぁ、普通は、こんな書き方はしない気がしますが、  こんなのでも動くよ の レベルです。


さて、画面には、この1行 PreviewKeyDown="SetWindowPreviewKeyDown" を付け加えます。
これは、 マウスの右クリックで ContextMenu を表示させると共に、 Fキーからも直接アクセスさせる為です。
キー取得 部分 のみを、ここで、記述しました。 *1.
マウスの動作等 その殆ど (所謂、ContexMenu そのもの) は、後述の ビハインドのコード で賄います。 *1.
キーのタイピングを Window で取得する様にする訳ですね。
因みに、この他のコードは Visual Studio 2013 Community Update5 の VB で、標準的に初期化される .xaml コードです。

 <Window x:Class="MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="WPF_ContextMenu" Height="350" Width="525"

    PreviewKeyDown="SetWindowPreviewKeyDown">
    <Grid>
         
    </Grid>

</Window>

そして、ContextMenu の定義と実際の操作 (核心部分) はこうです。

通常は、何項目か設定すると思いますが、 ここは例ですから、 Help F1 と表示される ひと項目 のみで書いています。
.Header で この文字列を与えても良いのですが、 複数項目で表示位置を揃える為に、.InputGestureText も使います。.
尚、 Form 時代の ContextMenu を踏襲しています。  ですから、この部分の命名規則も これに従っています。  少し変?。.

 Class MainWindow

    Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
        SetWindowContextMenu()
    End Sub

    Private Sub SetWindowContextMenu()
        Dim ContextMenuStripF0 As New System.Windows.Controls.ContextMenu()
        Dim F1ToolStripMenuItem As New System.Windows.Controls.MenuItem()

        F1ToolStripMenuItem.Header = "Help"

        F1ToolStripMenuItem.InputGestureText = "F1"

        ContextMenuStripF0.Items.Add(F1ToolStripMenuItem)

        Me.ContextMenu = ContextMenuStripF0

        AddHandler F1ToolStripMenuItem.Click, AddressOf F1ToolStripMenuItem_Click

        'Needs .xaml  <Window x:Class="MainWindow" ... PreviewKeyDown="SetWindowPreviewKeyDown">
        'F-Key Handler is ' Sub SetWindowPreviewKeyDown'
    End Sub

    Private Sub SetWindowPreviewKeyDown(ByVal sender As Object, e As KeyEventArgs)
        Select Case e.Key.ToString
            Case "F1"
                Me.F1ToolStripMenuItem_Click(sender, New System.Windows.RoutedEventArgs)

        End Select
    End Sub

    Private Sub F1ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs)
        'Sample MessageBox
        Dim noticeAdd As String = ""             ' Please Edit Notice : Add CrLf  or Chr(13)
        MessageBox.Show("MenuContext   Help   [ F1 ]"  _
                        , My.Application.Info.AssemblyName &  " (MenuContext F1)")
    End Sub
End Class


Form の時代には、複数項目からなる この様な雛形 を作って、見た目と使用感を統一していました。
それを、何とか、WPF に移行させた と言う処でしょうか ... 。
勿論、イベント名が違いますし、フレームワークも異なるので、同じ手法は使えませんが ... 。.

実際には、
項目を追加した雛形を作り上げ、 Partial Class で分離した上で、別ファイルに纏めて置き、
これをコピーして編集・利用する形で運用しても、良いかも。
この場合、先のコードの冒頭を 以下の様に直し、 このファイルをコピーし、
Class MainWindow には Me.Loaded のハンドラに SetWindowContextMenu() を加えるだけで、
ContextMenu が現れます。
あっ、.xaml コードに PreviewKeyDown="SetWindowPreviewKeyDown" もお忘れなく!。.

Partial Public Class MainWindow

    'Private Sub MainWindow_Loaded(sender As Object, e As RoutedEventArgs) Handles Me.Loaded
    '   SetWindowContextMenu()
    'End Sub

    Private Sub SetWindowContextMenu()
       '... 以下同様

まぁ、かなり、強引さは否めませんね。  きっと。



次の投稿の最後にシリーズのリンクを纏めてあります。   VB WPF お勉強 01 印象



[2015/10/10] .xaml コードで ContexMenu を記述していない点を明記 *1.
[2015/10/14] 引用部分をスクロール形式に

0 件のコメント:

コメントを投稿