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

次に、MainPage.xamlを展開して表示される、MainPage.xaml.vbをダブルクリックしてリスト2のコードを記述します。

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

リスト2 (MainPage.xaml.vb)

Option Strict On

ランチャーやチューザーに関するクラスの含まれる、Microsoft.Phone.Tasks名前空間をインポートします。
Imports Microsoft.Phone.Tasks

仮想ファイルシステムを作成および使用するための型が含まれている、System.IO.IsolatedStorage 名前空間をインポートします。
Imports System.IO.IsolatedStorage

アプリケーションでのリソースの使用をサポートするクラスを提供する、System.Windows.Resources名前空間をインポートします。
Imports System.Windows.Resources
Partial Public Class MainPage
  Inherits PhoneApplicationPage
 
  ' コンストラクター
  Public Sub New()
    InitializeComponent()
  End Sub

[着メロ設定]ボタンがクリックされた時の処理

新しい、WebClientのインスタンス、myWebClientを生成します。WebClientクラスはSystem.Net名前空間に属し、URI で識別されるリソースとの間でデータを送受信する共通メソッドを提供するクラスです。 
OpenReadAsyncメソッドで、指定したURIのwmaファイルを開きます。相対URIで指定します。OpenReadAsyncメソッドは、指定したリソースに対する読み取り可能なストリームを開くメソッドです。 
AddHandlerステートメントで、OpenReadCompletedイベントハンドラを追加します。OpenReadCompletedイベントは、非同期のリソース読み取り操作の完了時に発生します。 
OpenReadCompletedイベント内では以下の処理を行います。 
変数storageを、ファイルとディレクトリを格納している分離ストレージ領域を表すIsolateStorageFileクラスとして宣言し、呼び出し元のコードのアプリケーションIDに対応する、ユーザースコープの分離ストレージを取得します。
StreamResourceInfoクラスの型のresource変数を宣言します。StreamResourceクラスは、GetResourceStreamメソッドを使って取得したリソースのストリーム情報を提供するクラスです。ここでは、wmaファイルのストリーム情報を取得しています。wmaファイルは、ビルドアクションプロパティが「コンテンツ」になっていますので、GetResourceStreamメソッドでファイル名を指定してリソースを取得できます。
ストレージ内に「GreenBells.wma」という同じファイルが存在する場合は、削除します。
IsolatedStorageFileStreamクラス型のオブジェクト変数fileを宣言します。IsolatedStorageFileStreamクラスは、分離ストレージ内のファイルを公開するクラスです。IsolatedStorageFileクラスのCreateFileメソッドで「GreenBells.wma」ファイルを分離ストレージ内に作成します。Integer型変数bufferSizeに1023を格納し、bufferSizeで初期化された新しいByte型配列変数buffersを生成します。バッファサイズを1023確保します。
StreamResourceInfoクラスのStream.Readメソッドで、リソースに格納されているストリームを読み取りIsolatedStorageFileStreamにWriteメソッドで書き込みます。InlineAssignHelperヘルパー関数(後述)を使っています。
IsolatedStorageFileStream.Write メソッドの書式は下記の通りです。
IsolatedStorageFileStream.Write(書き込むバッファ,開始位置を示すバッファ内のオフセット,書き込むバッファの最大バイト数)
    
SaveRingtoneTaskの新しいインスタンスmySaveRingtoneTaskオブジェクトを生成します。
  DisplayNameプロパティには着メロを識別するための名前を指定します。これを指定しておくとOSから呼び出された「呼び出し音の保存」画面の「着信音の名前」に、ここで指定した名前が表示されます。
IsShareableプロパティには、着メロが他のアプリケーションからアクセス可能にするかどうかを示すフラグを指定します。可能にする場合はTrue、禁止する場合はFalseを指定します。ここではTrueを指定しています。
Sourceプロパティには分離ストレージに保存したファイルをパス付きで指定します。
チューザータスクが完了した時に発生するCompletedイベント内に、イベントハンドラを指定します。
イベントハンドラ内では、チューザータスクが正常に完了した場合には「保存に成功しました。」のメッセージを表示させます、それ以外は「保存に失敗しました。」と表示し処理を抜けます。
  Private Sub Button1_Click(sender As Object, e As System.Windows.RoutedEventArgs) Handles Button1.Click
    Dim myWebClient As New WebClient
    AddHandler myWebClient.OpenReadCompleted, Sub(resultSender As Object, resultArgs As OpenReadCompletedEventArgs)
 
      Dim storage As IsolatedStorageFile = IsolatedStorageFile.GetUserStoreForApplication
      Dim resource As StreamResourceInfo = Application.GetResourceStream(New Uri("GreenBells.wma", UriKind.Relative))
        If storage.FileExists("GreenBells.wma") = True Then
          storage.DeleteFile("GreenBells.wma")
        End If
      
      Using file As IsolatedStorageFileStream = storage.CreateFile("GreenBells.wma")
        Dim bufferSize As Integer = 1023
        Dim buffers As Byte() = New Byte(bufferSize) {}
        Dim bufferCount As Integer
        While (InlineAssignHelper(bufferCount, resource.Stream.Read(buffers, 0, bufferSize))) > 0
          file.Write(buffers, 0, bufferCount)
        End While
      End Using
 
      Dim mySaveRingToneTask As New SaveRingtoneTask
 
            With mySaveRingToneTask
              .DisplayName = "The Green Bells"
              .IsShareable = True
              .Source = New Uri("isostore:/GreenBells.wma")
            End With
 
      AddHandler mySaveRingToneTask.Completed, Sub(mySender As Object, myArgs As TaskEventArgs)
          If myArgs.TaskResult = TaskResult.OK Then
              MessageBox.Show("保存に成功しました。")
          Else
              MessageBox.Show("保存に失敗しました。")
              Exit Sub
          End If
        End Sub
          mySaveRingToneTask.Show()
      End Sub
    myWebClient.OpenReadAsync(New Uri("GreenBells.wma", UriKind.Relative))
  End Sub

MSDNのドキュメントで下記のように定義されているInlineAssignHelperヘルパー関数

  Private Shared Function InlineAssignHelper(Of T)(ByRef target As T, ByVal value As T) As T
    target = value
    Return value
  End Function
End Class

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30