コンテキストメニューは、右クリックや右タップをしたときに表示されるメニューです。
今回は、このポップアップメニューを作成していきます。
ポップアップメニューには
- より大きく
- より小さく
- 赤
というメニューを表示し、選択されたらTextBlockコントロールに対して操作を行うようにします。
最初に、MainPage.xaml にTextBlockコントロールを貼り付け、NameプロパティをtxbNameにします。
次に、右クリックや右タップに対応できるようにMainPage.xaml のルートコントロールである Gridのイベントを作成します。
XAMLは以下の様になります。
XAMLの例
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" RightTapped="Grid_RightTapped"> <TextBlock x:Name="txbName" HorizontalAlignment="Left" Margin="205,219,0,0" TextWrapping="Wrap" Text="TextBlock" VerticalAlignment="Top"/> </Grid>
次に、Grid_RightTappedには以下のようなコードを記述します。
VBの例
Private Async Sub Grid_RightTapped(sender As Object, e As RightTappedRoutedEventArgs) Dim popup As New PopupMenu() popup.Commands.Add(New UICommand("より大きく", AddressOf OnLarge, 1.5)) popup.Commands.Add(New UICommand("より小さく", AddressOf OnSmall, 1.5)) popup.Commands.Add(New UICommandSeparator()) popup.Commands.Add(New UICommand("赤", AddressOf OnRed, Windows.UI.Colors.Red)) Await popup.ShowAsync(e.GetPosition(Me)) End Sub
C#の例
async private void Grid_RightTapped(object sender, RightTappedRoutedEventArgs e) { PopupMenu popup = new PopupMenu(); popup.Commands.Add(new UICommand("より大きく", OnLarge, 1.5)); popup.Commands.Add(new UICommand("より小さく", OnSmall, 1.5)); popup.Commands.Add(new UICommandSeparator()); popup.Commands.Add(new UICommand("赤", OnRed, Windows.UI.Colors.Red)); await popup.ShowAsync(e.GetPosition(this)); }
ポップアップメニューを作成するにはPopupMenuクラスを使用します。
PopupMenuクラスのインスタンスを作成したら、Command.Addでメニューを追加していきます。
メニュー自体はUICommandクラスで作成します。ちなみに、メニューとメニューの間にセパレータを挿入したい場合は、UICommadSeparatorクラスを使用します。
UICommandクラスの第1引数にはメニューのラベル、第2引数にはメニュークリック時に実行されるイベントハンドラーを指定します。第3引数はイベントハンドラーに渡すパラメータです。
例として「より大きく」と書かれたメニュー部分を見て下さい。第1引数にコンテキストメニューに表示されるラベルとして「より大きく」が指定されています。第2引数は、「より大きく」がクリックされた時に実行されるイベントハンドラーとしてOnLargeを指定しています。第3引数の1.5という数値は、実行時にフォントサイズを元のサイズより1.5倍にするための数値です。第3引数には数値以外に文字や色を渡すことが可能です。
最後に、ポップアップメニューの表示ですがShowAsyncメソッドを使用します。ShowAsyncとなっているくらいですから、このメソッドは非同期で動きます。よってこのメソッドの呼び出しの先頭にはawaitキーワードが必要となります。またGrid_RightTappedイベントは非同期メソッドを含むので、Async(C#はasync)キーワードが必要になります。
参考までに、各メニュー実行時のイベントコードを以下に掲載します。
イベントの引数はIUICommad型のパラメータを受け取ります。受け取ったパラメータは適切な型にキャストして使用します。
VBの例
'より大きく Private Sub OnLarge(cmd As IUICommand) txbName.FontSize *= DirectCast(cmd.Id, Double) End Sub 'より小さく Private Sub OnSmall(cmd As IUICommand) txbName.FontSize *= DirectCast(cmd.Id, Double) End Sub '赤 Private Sub OnRed(cmd As IUICommand) txbName.Foreground = New SolidColorBrush(DirectCast(cmd.Id, Windows.UI.Color)) End Sub
C#の例
//より大きく void OnLarge(IUICommand cmd) { txbName.FontSize *= (double)cmd.Id; } //より小さく void OnSmall(IUICommand cmd) { txbName.FontSize *= (double)cmd.Id; } //赤 void OnRed(IUICommand cmd) { txbName.Foreground = new SolidColorBrush((Windows.UI.Color)cmd.Id); }
コメント