ピクチャライブラリへのアクセス許可の設定
ピクチャライブラリへのアクセス許可の設定
今回のサンプルも、ピクチャライブラリにアクセスしますので、「画像ライブラリ」へのアクセス許可が必要になります。ソリューションエクスプローラー内に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
今回はここまでです。ありがとうございました。
- この記事のキーワード