ポップアップメニューから各種コントロールを表示する

2013年2月1日(金)
薬師寺 国安

マイク、ピクチャライブラリ、Webカメラへのアクセス許可の設定

今回のサンプルは、ピクチャライブラリにアクセスしますので、「画像ライブラリ」へのアクセス許可が必要になります。ソリューションエクスプローラー内にpackage.appxmanifestというファイルがありますので、このファイルをダブルクリックします。「機能」タブをクリックして、表示される画面の「機能:」にある、「マイク」、「画像ライブラリ」、「Webカメラ」にチェックを付けます(図3)。

図3:package.appxmanifestファイルを開き「マイク」、「画像ライブラリ」、「Webカメラ」にチェックを付ける(クリックで拡大)

次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト2のコードを記述します。

ロジックコードを記述する

リスト2 (MainWindow.xaml.vb)

Option Strict On

PopupMenuであるコンテキストメニューを表示させるのに必要なクラスの含まれる、Windows.UI.Popups名前空間をインポートします。

Imports Windows.UI.Popups

写真、オーディオの録音とビデオのキャプチャを提供するクラスの含まれる、Windows.Media.Capture名前空間をインポートします。

Imports Windows.Media.Capture

ファイル、フォルダー、およびアプリケーションの設定を管理するクラスの含まれる、Windows.Storage名前空間をインポートします。

Imports Windows.Storage

Public NotInheritable Class MainPage
  Inherits Page

写真、オーディオの録音やビデオをキャプチャするMediaCaptureクラス型のメンバ変数、myMediaCaptureを宣言します。

Dim myMediaCapture As MediaCapture

インデックスでアクセスできる読み取り専用のファイルのコレクションを表すインターフェースである、IReadOnlyList(Of IStorageFile)型のメンバ変数、myPictureFilesを宣言します。

  Dim myPictureFiles As IReadOnlyList(Of IStorageFile)

LayoutRootという名前のGrid上にポインターがあった時、右タップの入力刺激があった時の処理

2次元空間でのXとY座標のペアを表すPoint構造体を、右タップされた時点のXとY座標で初期化します。-540は位置合わせのための数値です。

LayoutRootの描画時の幅と高さで初期化された、新しいSizeのインスタンスmySizeオブジェクトを作成します。Size構造体はオブジェクトの幅と高さを表します。

四角形の幅、高さ、および原点を表すRect構造体を、Point構造体のオブジェクトmyPointと、Size構造体のオブジェクトmySizeで初期化した、新しいRectのインスタンス、myRectオブジェクトを作成します。

ポップアップメニューを表すPopupMenuクラスのインスタンス、myPopupオブジェクトを作成します。

Command.Addメソッドで、PopupMenuに項目名と、その項目をタップした際のコマンドを追加します。UICommandクラスは、コンテキストメニュー内のコマンドを表します。PopupMenuに「Webカメラ」、「画像一覧」、「全クリア」の項目を追加し、それらに対するコマンドを追加します。

ShowForSelectionAsyncメソッドで、指定された選択項目を基準とする適切な位置に、コンテキストメニューを表示します。この場合はLayoutRoot内で右タップがされた位置の左側(Placement.Left)にコンテキストメニューが表示されます。Placement列挙体については、下記のURLを参考にしてください。
→ Placement enumeration (Windows)

非同期処理で行われるため、メソッドの先頭にAsyncを追加します。Asyncが追加されていると、その処理が非同期で行われることを意味します。

  Private Async Sub LayoutRoot_RightTapped(sender As Object, e As RightTappedRoutedEventArgs) Handles LayoutRoot.RightTapped
    Dim myPoint As Point = New Point(e.GetPosition(LayoutRoot).X, e.GetPosition(LayoutRoot).Y - 540)
    Dim mySize As New Size(LayoutRoot.ActualWidth, LayoutRoot.ActualHeight)
    Dim myRect As New Rect(myPoint, mySize)
 
    Dim myPopup As New PopupMenu

    myPopup.Commands.Add(New UICommand("Web カメラ", Sub(command)
                                                          ShowWebCamera()
                                                        End Sub))
    myPopup.Commands.Add(New UICommand("画像一覧", Sub(command)
                                                          ShowImage()
                                                        End Sub))
    myPopup.Commands.Add(New UICommand("全クリア", Sub(command)
                                                          AllClear()
                                                        End Sub))
    Await myPopup.ShowForSelectionAsync(myRect, Placement.Left)
  End Sub
  • ポップアップメニューから各種コントロールを表示するWindows8アプリ

薬師寺国安事務所

薬師寺国安事務所代表。Visual Basic プログラミングと、マイクロソフト系の技術をテーマとした、書籍や記事の執筆を行う。
1950年生まれ。事務系のサラリーマンだった40歳から趣味でプログラミングを始め、1996年より独学でActiveXに取り組む。1997年に薬師寺聖とコラボレーション・ユニット PROJECT KySS を結成。2003年よりフリーになり、PROJECT KySS の活動に本格的に参加、.NETやRIAに関する書籍や記事を多数執筆する傍ら、受託案件のプログラミングも手掛ける。Windows Phoneアプリ開発を経て、現在はWindows ストア アプリを多数公開中

Microsoft MVP for Development Platforms - Client App Dev (Oct 2003-Sep 2012)。Microsoft MVP for Development Platforms - Windows Phone Development(Oct 2012-Sep 2013)。Microsoft MVP for Development Platforms - Client Development(Oct 2013-Sep 2014)。Microsoft MVP for Development Platforms-Windows Platform Development (Oct 2014-Sep 2015)。

連載バックナンバー

Think ITメルマガ会員登録受付中

Think ITでは、技術情報が詰まったメールマガジン「Think IT Weekly」の配信サービスを提供しています。メルマガ会員登録を済ませれば、メルマガだけでなく、さまざまな限定特典を入手できるようになります。

Think ITメルマガ会員のサービス内容を見る

他にもこの記事が読まれています