Stroke情報の保存
InkCanvas.
Using fs = New System.IO.FileStream("strokes", IO.FileMode.Create, IO.FileAccess.Write)
MyInkCanvas.Strokes.Save(fs)
End Using
ただ,
Using ms = New System.IO.MemoryStream
XamlWriter.Save(MyInkCanvas.Strokes, ms)
Dim strokes = System.Text.Encoding.UTF8.GetString(ms.ToArray)
End Using
入力されたStroke情報をMeshへ追加・
XML形式にする部分をメソッド化しMesh Objectの更新処理を追加したコードを以下に示します。
Private Sub SetStrokes()
Using ms = New System.IO.MemoryStream
XamlWriter.Save(MyInkCanvas.Strokes, ms)
Dim strokes = System.Text.Encoding.UTF8.GetString(ms.ToArray)
WhiteboardObject.Resource.SetUserData(Of String)(strokes)
End Using
WhiteboardObject.Update()
End Sub
Private Sub MyInkCanvas_StrokeErased(ByVal sender As Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyInkCanvas.StrokeErased
SetStrokes()
End Sub
Private Sub MyInkCanvas_StrokeCollected(ByVal sender As Object, ByVal e As System.Windows.Controls.InkCanvasStrokeCollectedEventArgs) Handles MyInkCanvas.StrokeCollected
SetStrokes()
End Sub
クリアボタンをクリックしたときには上記のイベントは発生しないため,
以上で,
Stroke情報の復元
Mesh ObjectにはXML形式の文字列としてStroke情報を保存していたので,
Private Sub GetStrokes()
WhiteboardObject.Load()
Dim xml = WhiteboardObject.Resource.GetUserData(Of String)()
If xml IsNot Nothing Then
Dim strokes = TryCast(XamlReader.Parse(xml), StrokeCollection)
If strokes IsNot Nothing Then
MyInkCanvas.Strokes.Clear()
MyInkCanvas.Strokes.Add(strokes)
End If
End If
End Sub
明示的にMesh ObjectのLoadメソッドを呼び,
Stroke情報を復元するタイミングはアプリケーションの起動時とMesh Objectがほかのデバイスからなど外部要因で更新された場合です。起動時に処理するにはウィンドウのLoadイベントの最後にGetStrokesメソッドの呼び出しを追加ます。Mesh Objectの更新通知を受信するには,
Private Sub WhiteboardObject_ChangeNotificationReceived(ByVal sender As Object, ByVal e As System.EventArgs) Handles WhiteboardObject.ChangeNotificationReceived
GetStrokes()
End Sub
更新通知の受信については前回に紹介していますので,
以上で今回作成するアプリケーションは完成です。実行してみて動作を確認してみてください。アプリケーションを終了し,
おわりに
最後に作成したアプリケーションの動作について改良点などを補足しておきます。
実際にアプリケーションを実行してみて気づいたかもしれませんが,
WhiteboardObject.UpdateAsync("state") ' 非同期呼び出し
非同期呼び出しをした場合Object型の引数を指定できます。アプリケーションで何らかの状態を管理する必要がある場合に利用します。非同期処理が完了を知るにはイベントを使用します。
Private Sub WhiteboardObject_UpdateCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WhiteboardObject.UpdateCompleted
Console.WriteLine(e.UserState)
End Sub
非同期処理が完了するまで次の非同期処理のメソッドを呼ぶことはできません。そのため,
また,