InkCanvas に描いたストロークは、InkSerializedFormat 形式(拡張子 ISF)と呼ばれる専用のファイルに保存したり読み込んだりすることが可能です。
専用のファイルを利用することで、途中まで描いた絵を保存し、続きは後から描くといったように再利用を可能にします。
ISF形式で保存するには FileStremを作成して、Strokes プロパティのSaveメソッドを使用します。
また、ISF形式のファイルを読み込んで InkCanvasに表示するには、FileStream で任意のファイルを開いて StrokeCollection クラスのインスタンスを作成し、 Strokes プロパティにセットします。
下記は InkCanvas に描かれたストロークをISF形式で保存したり開いたりする例です。
XAMLの例
<StackPanel Name="parentStack"> <StackPanel Orientation="Horizontal" Name="menuStack"> <Button Name="btnSaveAsISF" Content="ISF形式で保存" /> <Button Name="btnOpenISF" Content="ISF形式ファイルを開く" /> </StackPanel> <InkCanvas Name="InkCanvas1" EditingMode="Ink" /> </StackPanel>
VBの例
' [ISF形式で保存する]ボタンクリック時の処理 Private Sub btnSaveAsISF_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnSaveAsISF.Click Dim dlgSave As New Microsoft.Win32.SaveFileDialog() dlgSave.Filter = "ISFファイル(*.isf)|*.isf" If dlgSave.ShowDialog() Then Using fs As New System.IO.FileStream(dlgSave.FileName, IO.FileMode.Create) InkCanvas1.Strokes.Save(fs) End Using MessageBox.Show("保存しました") End If End Sub ' [ISF形式ファイルを開く]ボタンクリック時の処理 Private Sub btnOpenISF_Click(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles btnOpenISF.Click Dim dlgOpen As New Microsoft.Win32.OpenFileDialog() dlgOpen.Filter = "ISFファイル(*.isf)|*.isf" If dlgOpen.ShowDialog() Then '現在のストロークをクリア InkCanvas1.Strokes.Clear() Using fs As New System.IO.FileStream(dlgOpen.FileName, IO.FileMode.Open) InkCanvas1.Strokes = New Ink.StrokeCollection(fs) End Using End If End Sub
C#の例
// [ISF形式で保存する]ボタンクリック時の処理 private void btnSaveAsISF_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.SaveFileDialog dlgSave = new Microsoft.Win32.SaveFileDialog(); dlgSave.Filter = "ISFファイル(*.isf)|*.isf"; if ((bool)dlgSave.ShowDialog()) { using ( System.IO.FileStream fs = new System.IO.FileStream(dlgSave.FileName, System.IO.FileMode.Create)) { inkCanvas1.Strokes.Save(fs); } MessageBox.Show("保存しました"); } } // [ISF形式ファイルを開く]ボタンクリック時の処理 private void btnOpenISF_Click(object sender, RoutedEventArgs e) { Microsoft.Win32.OpenFileDialog dlgOpen = new Microsoft.Win32.OpenFileDialog(); dlgOpen.Filter = "ISFファイル(*.isf)|*.isf"; if ((bool)dlgOpen.ShowDialog()) { // 現在のストロークをクリア inkCanvas1.Strokes.Clear(); using (System.IO.FileStream fs = new System.IO.FileStream(dlgOpen.FileName, System.IO.FileMode.Open)) { inkCanvas1.Strokes = new System.Windows.Ink.StrokeCollection(fs); } } }