言葉の表示されているリストボックスから言葉が選択された時の処理
wavListBoxの選択されたインデックスの値が0かそれより大きく、且つclaudiaListBoxの選択されたインデックスの値が0かそれより大きい場合、つまり、wavaListBoxから言葉が選択され、且つクラウディアが選択された場合は、[Save]アイコンの使用を可能にします。それ以外は使用不可とします。
1 | Private Sub wavListBox_SelectionChanged(sender As Object, e As SelectionChangedEventArgs) Handles wavListBox.SelectionChanged |
2 | If claudiaListBox.SelectedIndex>= 0 AndAlsowavListBox.SelectedIndex>= 0 Then |
3 | saveButton.IsEnabled = True |
5 | saveButton.IsEnabled = False |
[Save]アイコンがタップされた時の処理
Frameを表示状態にします。メンバ変数claudiaSelectedImageにclaudiaListBoxから選択された項目のインデックスに対応する- 要素の属性”Large”の値を取得して格納します。
メンバ変数wavSelectedFileにwavListBoxから選択された項目のインデックスに対応する- 要素の属性”wav”の値を取得して格納します。
Visual Basic の埋め込み式を用いて、ルート要素、その子要素として
とを作成し、埋め込み式の構文であるを用いてメンバ変数claudiaSelectedImageの値とwavSelectedFileの値を指定します。これは ASP.NET で使用される構文と同じです。作成したXML文書を変数saveXmlに格納します。
XElemet.Parseメソッドで作成したXMLを文字列として読み込みます。読み込んだ結果XMLを変数resultに格納しておきます。
ピクチャライブラリにアクセスします。
CreateFolderAsyncメソッドでピクチャライブラリ内にclaudiaXMLというサブフォルダを作成します。
CreationCollisionOption.OpenIfExistsを指定すると、既に同名フォルダが存在する場合は、そのフォルダ名を返し、ない場合は新規に作成されます。
また、CreateFileAsyncメソッドでピクチャライブラリのclaudiaXMLサブフォルダ内にclaudiaInfo.xmlというファイルを作成します。
CreationCollisionOption.ReplaceExistingと指定し、既に同名のファイルがある場合は上書きします。
OpenAsyncメソッドで作成したclaudiaInfo.xmlを「読み取り/書き込み」モードで開き、入出力データへの、ランダムアクセスをサポートするIRandomAccessStreamインターフェース型のmyStreamで参照します。
データを出力ストリームに書き込む、新しいDataWriterのインスタンスをmyStreamで初期化し、writerオブジェクトを作成します。
出力ストリームのUnicode文字エンコードを設定する、UnicodeEncodingプロパティにUtf8を指定します。
Writeメソッドで出力ストリームにresult変数の値を書き込みます。
StoreAsyncメソッドでバッキングストアにバッファーのデータをコミットします。
[Folder]アイコンの使用を可能にし、ClaudiaShowPageに遷移します。引数には何も持たせません。
非同期処理で行われるため、メソッドの先頭にAsyncを追加します。
01 | Private Async Sub saveButton_Click(sender As Object, e As RoutedEventArgs) Handles saveButton.Click |
02 | myFrame.Visibility = Windows.UI.Xaml.Visibility.Visible |
03 | claudiaSelectedImage = xmldoc.Descendants("Item")(claudiaListBox.SelectedIndex).Attribute("Large").Value |
04 | wavSelectedFile = wavXmldoc.Descendants("Item")(wavListBox.SelectedIndex).Attribute("wav").Value |
06 | Dim saveXml As XElement = <Claudia><Image><%= claudiaSelectedImage %></Image><Wav><%= wavSelectedFile %></Wav></Claudia> |
07 | Dim saveXmldoc As XElement = XElement.Parse(saveXml.ToString) |
08 | Dim result As String = saveXmldoc.ToString |
09 | Dim myStorageFolder As StorageFolder = Windows.Storage.KnownFolders.PicturesLibrary |
10 | Dim mySubFolder = Await myStorageFolder.CreateFolderAsync("claudiaXML", CreationCollisionOption.OpenIfExists) |
11 | Dim myXmlFile As StorageFile = Await mySubFolder.CreateFileAsync("claudiaInfo.xml", CreationCollisionOption.ReplaceExisting) |
13 | Using myStream As IRandomAccessStream = Await myXmlFile.OpenAsync(FileAccessMode.ReadWrite) |
14 | Dim writer As DataWriter = New DataWriter(myStream) |
15 | writer.UnicodeEncoding = UnicodeEncoding.Utf8 |
16 | writer.WriteString(result) |
17 | Await writer.StoreAsync |
20 | openButton.IsEnabled = True |
21 | myFrame.Navigate(GetType(ClaudiaShowPage), Nothing) |
戻る(←)アイコンがタップされた時の処理
Frameを非表示にします。
1 | Private Sub backButton_Click(sender As Object, e As RoutedEventArgs) Handles backButton.Click |
2 | myFrame.Visibility = Windows.UI.Xaml.Visibility.Collapsed |
[Folder]アイコンがタップされた時の処理
Frameを表示して、ClaudiaShowPageに遷移します。
1 | Private Sub openButton_Click(sender As Object, e As RoutedEventArgs) Handles openButton.Click |
2 | myFrame.Visibility = Windows.UI.Xaml.Visibility.Visible |
3 | myFrame.Navigate(GetType(ClaudiaShowPage), Nothing) |
次に、ソリューションエクスプローラー内のClaudiaShowPage.xamlを展開して表示される、ClaudiaShowPage.xaml.vbをダブルクリックしてリスト5のコードを記述します。
ロジックコードを記述する
リスト5 (ClaudiaShowPage.xaml.vb)
3 | Imports Windows.Storage.Streams |
5 | Public NotInheritable Class ClaudiaShowPage |
ページがアクティブになった時の処理
ピクチャライブラリにアクセスします。CreateFolderAsyncメソッドでピクチャライブラリ内にclaudiaXMLというサブフォルダを作成します。
CreationCollisionOption.OpenIfExistsを指定すると、既に同名フォルダが存在する場合は、そのフォルダ名を返し、存在しない場合は新規に作成されます。
GetFileAsyncメソッドでclaudiaXMLサブフォルダ内のclaudiaInfo.xmlを取得します。
OpenAsyncメソッドでclaudiaInfo.xmlを「読み取り」モードで開き、入出力データへの、ランダムアクセスをサポートするIRandomAccessStreamインターフェース型のmyStreamで参照します。
読み込んだXMLファイルと文字コードで初期化された新しいStreamReaderクラスのインスタンスreaderオブジェクトを作成します。
ReadToEndeメソッドでXML文書を末尾まで読み込み変数resultに格納します。
XElement.Parseメソッドで変数resultの値を文字列として読み込みます。
ClaudiaImageのSourceプロパティに画像を配置しているms-appx:///Images/フォルダと、
要素の値を連結して指定します。これで、クラウディアの画像が表示されます。
MediaElementのSourceプロパティに音声ファイルを配置しているms-appx:///WAV/フォルダと要素の値を連結して指定します。選択されていた言葉が喋られます。
非同期処理で行われるためメソッドの先頭にAsyncを追加します。
01 | Protected Overrides Async Sub OnNavigatedTo(e As Navigation.NavigationEventArgs) |
03 | Dim myStorageFolder As StorageFolder = Windows.Storage.KnownFolders.PicturesLibrary |
04 | Dim mySubFolder = Await myStorageFolder.CreateFolderAsync("claudiaXML", CreationCollisionOption.OpenIfExists) |
05 | Dim myFile = Await mySubFolder.GetFileAsync("claudiaInfo.xml") |
06 | Using myStream As IRandomAccessStream = Await myFile.OpenAsync(FileAccessMode.Read) |
07 | Using reader As StreamReader = New StreamReader(myStream.AsStream, System.Text.Encoding.UTF8) |
08 | result = reader.ReadToEnd |
11 | Dim doc As XElement = XElement.Parse(result) |
12 | ClaudiaImage.Source = New BitmapImage(New Uri("ms-appx:///Images/" &doc.Descendants("Image").Value)) |
13 | MediaElement1.Source = New Uri("ms-appx:///WAV/" &doc.Descendants("Wav").Value) |
[Play]アイコンがタップされた時の処理
再生を開始し、[Play]アイコンを使用不可にして[Stop]アイコンの使用を可能にします。
1 | Private Sub playButton_Click(sender As Object, e As RoutedEventArgs) Handles playButton.Click |
3 | playButton.IsEnabled = False |
4 | stopButton.IsEnabled = True |
[Stop]アイコンがタップされた時の処理
再生を停止し、[Stop]アイコンを使用不可にして[Play]アイコンの使用を可能にします。
1 | Private Sub stopButton_Click(sender As Object, e As RoutedEventArgs) Handles stopButton.Click |
3 | stopButton.IsEnabled = False |
4 | playButton.IsEnabled = True |
今回はここまでです。ありがとうございました。
筆者からのお知らせ
筆者はWindowsストアでアプリを公開しています。チャームの検索からWindowsストアを選択して、検索欄に、kuniyasuまたはYakushijiKuniyasuと入力すると、公開されているアプリの一覧が表示されます。上記はどちらも私のアカウントですので、興味のある方は是非ダウンロードして使ってみてください。