ListBoxに表示された画像をポップアップメニューから削除する+1つのサンプル
ピクチャライブラリへのアクセス許可の設定
今回のサンプルも、ピクチャライブラリにアクセスしますので、「画像ライブラリ」へのアクセス許可が必要になります。ソリューションエクスプローラー内にpackage.appxmanifestというファイルがありますので、このファイルをダブルクリックします。「機能」タブをクリックして、表示される画面の「機能:」にある、「画像ライブラリ」にチェックを付けてください。
次に、ソリューションエクスプローラー内のMainWindow.xamlを展開して表示される、MainWindow.xaml.vbをダブルクリックしてリスト3のコードを記述します。
ロジックコードを記述する
リスト3 (MainWindow.xaml.vb)
Option Strict On
タイマーに関するクラスの含まれる、Windows.System.Threading名前空間をインポートします。
Imports Windows.System.Threading
ファイル、フォルダー、およびアプリケーションの設定を管理するクラスの含まれる、Windows.Storage名前空間をインポートします。
Imports Windows.Storage
PopupMenuであるコンテキストメニューを表示させるのに必要なクラスの含まれる、Windows.UI.Popups名前空間をインポートします。
Imports Windows.UI.Popups Public NotInheritable Class MainPage Inherits Page
DispacherTimerクラスの新しいインスタンス、myTimerメンバ変数を宣言します。DispatcherTimerクラスは、指定した時間の間隔で、指定した優先順位で処理される Dispatcher キューに統合されているタイマーを表すクラスです。
Dim myTimer As New DispatcherTimer
ファイルの個数をカウントするメンバ変数Indexを宣言します。
Dim Index As Integer = 0
インデックスによってアクセスできるファイルの読み取り専用コレクションを表す、IReadOnlyList(Of IStorageFile)型のメンバ変数myPictureFilesを宣言します。
Dim myPictureFiles As IReadOnlyList(Of IStorageFile)
ページがアクティブになった時の処理
ピクチャライブラリのサブフォルダーageRecordsにアクセスします。CreateFolderAsyncメソッドに、CreationCollisionOption.OpenIfExistsと指定して、ageRecordsというフォルダーが既に存在する場合は、そのフォルダー名を返し、ない場合は新規にフォルダーを作成します。
CreationCollisionOption列挙体については下記のURLを参照してください。
→ CreationCollisionOption enumeration (Windows)
GetFilesAsyncメソッドでageRecordsフォルダー内のファイルを取得し、コレクション変数myPictureFilesに格納します。ageRecordsサブフォルダー内にファイルがない場合は警告メッセージを発して処理を抜けます。
非同期処理で行われるため、メソッドの先頭にAsyncを追加します。Asyncが追加されていると、その処理が非同期で行われることを意味します。
Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) Dim pictureFolder As StorageFolder = KnownFolders.PicturesLibrary Dim pictureSubFolder As StorageFolder = Await pictureFolder.CreateFolderAsync("ageRecords", CreationCollisionOption.OpenIfExists) myPictureFiles = Await pictureSubFolder.GetFilesAsync() If myPictureFiles.Count<= 0 Then Dim message As MessageDialog = New MessageDialog("表示するファイルがありません") Await message.ShowAsync() Exit Sub End If End Sub
[表示]ボタンがクリックされた時の処理
タイマーの感覚を0.5秒とします。Buttonの表面の文字で条件分岐を行います。
Buttonの文字が「表示」であった場合は、AddHandlerステートメントで、指定したタイマーの間隔が経過し、タイマーが有効である場合に発生するTickイベントに、myTimer_Tickイベントハンドラを追加します。
タイマーをスタートし、Buttonの文字を「中止」に置き換えます。
Buttonの文字が「中止」であった場合は、タイマーをストップし、イベントハンドラ—を解除し、Buttonの文字を「表示」とします。
Private Sub Button1_Click(sender As Object, e As RoutedEventArgs) Handles Button1.Click myTimer.Interval = New TimeSpan(0, 0, CInt(0.5)) Select Case Button1.Content.ToString Case "表示" AddHandlermyTimer.Tick, AddressOfmyTimer_Tick myTimer.Start() Button1.Content = "中止" Case "中止" myTimer.Stop() RemoveHandlermyTimer.Tick, AddressOfmyTimer_Tick Button1.Content = "表示" End Select End Sub
指定したタイマーの間隔が経過し、タイマーが有効である場合に発生するイベント
1ずつ加算されるメンバ変数Indexの値が、ageRecordsサブフォルダー内にあるファイルの数と同じかそれ以上であった場合は、Indexの値を0で初期化します。
タイマーを停止します。
イベントハンドラを解除し、Buttonの文字を「表示」に置き換えます。
それ以外の場合、つまりIndexの値が、ageRecordsサブフォルダー内のファイルの個数よりも小さい場合は、TextBoxにメンバ変数Indexの値を文字列にキャストして表示します。
BitmapImageの新しいインスタンスbmpオブジェクトを作成します。SetSourceメソッドにAwait myPictureFiles(Index).OpenReadAsyncと指定して、1ずつ加算される変数Indexに対応するmyPictureFilesコレクション変数の持つファイルを、OpenReadAsyncメソッドで開いていきます。
ImageのSourceプロパティにbmpオブジェクトを追加し、Indexの値を1ずつ加算します。これで、0.5秒間隔で、ageRecordsサブフォルダー内の画像が表示されます。
非同期処理で行われるため、メソッドの先頭にAsyncを追加します。Asyncが追加されていると、その処理が非同期で行われることを意味します。
Private Async Sub myTimer_Tick(sender As Object, e As Object) If Index >= myPictureFiles.Count Then Index = 0 myTimer.Stop() RemoveHandlermyTimer.Tick, AddressOfmyTimer_Tick Button1.Content = "表示" Else TextBox1.Text = Index.ToString Dim bmp As New BitmapImage bmp.SetSource(Await myPictureFiles(Index).OpenReadAsync) Image1.Source = bmp Index += 1 End If End Sub End Class
今回はここまでです。ありがとうございました。
ListBoxに表示された画像をポップアップメニューから削除するWindowsアプリ
複数の画像を連続表示する
連載バックナンバー
Think ITメルマガ会員登録受付中
全文検索エンジンによるおすすめ記事
- 画像に各種フィルタを適用して保存するWindowsアプリを作る
- Webカメラで撮影した写真をセピア調に演出するアプリを作る
- 画像の一覧表示と、ListBoxに表示されたYoutubeの再生を試す
- ピクチャライブラリ内の画像を指定して表示する+1つのサンプル
- 撮影した写真の管理ができるマイフォトアプリを作る
- 画面上を流れる数字を暗算して正解を求めるアプリを作ろう(その2)
- タブレットPCの加速度センサーを使って目的の画像を直感的に探せるプログラムを作る
- PCで撮影した写真を並べて最適な1枚を選べるプログラムをつくる
- 場所と写真を記録するプログラムを作って思い出のシーンを保存しよう
- センサーの範囲内にいる人間を見つけて撮影・保存するKinectサンプル