でも、あると便利なのですよね。 そこで、雛形を作ってありました。 そして、偶には、利用していました。.
さて、これを、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 件のコメント:
コメントを投稿