2

InkPresenterがあり、InkPresenter . Strokes . Add(Stroke)を使用してストロークを追加します。その後、InkPresenter をファイル システムまたはデータベースにシリアル化/保存したいと考えています。Ink.Strokes は StrokeCollection のタイプであり、MSDN によると、この問題には Save(Stream) メソッドがあるとのことです。Windows Phone では、この機能が不足しているようです。

おそらく、InkPresenter コントロールをシリアル化および逆シリアル化する別の方法があります。

4

2 に答える 2

3

Jeff の投稿のように、Windows Phone でこれを行う唯一の方法は、ストロークを保存する独自のタイプを用意し、それを分離ストレージに保存してから、それをロードして基本的にストロークを「再生」することです。または、StrokeCollection を書式設定された文字列として保存することもできます。

基本的に、各ストロークは色と多数のポイントで構成されます。このようにして、たとえば、StrokeCollection次のような単純な形式で文字列のコレクションとして を保存できます。

Color|X1,Y1$X2,Y2$X3,Y3 -- 単一のストロークを表します

これで、ストローク コレクションとファイル名を受け取る関数を記述して、ファイルを保存できます。StrokeCollection

public void SaveStrokes(string filename, StrokeCollection strokeCollection) {
  var isf = IsolatedStorageFile.GetUserStoreForApplication();
  var stream = isf.CreateFile(filename);

  using (var writer = new StreamWriter(stream)) {
    foreach (var stroke in strokeCollection) {
      writer.WriteLine(String.Format("{0}|{1}", 
          stroke.DrawingAttributes.Color.ToString(), 
          String.Join("$", stroke.StylusPoints.Select(p => String.Format("{0},{1}", p.X, p.Y)))));
    }
  }
}

これをロードしてストロークを表示する関数だけが必要です。上記の方法で保存されたストローク コレクションをロードするロード関数は、次のようになります。

public void LoadStrokes(string filename, InkPresenter inkPresenter) {
  var isf = IsolatedStorageFile.GetUserStoreForApplication();
  var stream = isf.OpenFile(filename, FileMode.Open);

  using (var reader = new StreamReader(stream)) {
    var strokes = reader.ReadToEnd().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
    foreach (var stroke in strokes) {
      var strokeParams = stroke.Split('|');

      var myStroke = new Stroke();
      myStroke.DrawingAttributes.Color = HexToColor(strokeParams[0].ToString());

      var pointList = strokeParams[1].Split('$');
      foreach (var pointPair in pointList) {
        var pointPairList = pointPair.Split(',');
        var x = Convert.ToDouble(pointPairList[0]);
        var y = Convert.ToDouble(pointPairList[1]);

        myStroke.StylusPoints.Add(new StylusPoint(x, y));
      }

      inkPresenter.Strokes.Add(myStroke);
    }
  }
}

色は Hex 形式で保存されるため、それを色列挙型に変換する関数が必要になります。

public System.Windows.Media.Color HexToColor(string hexString) {
  string cleanString = hexString.Replace("-", String.Empty).Substring(1);

  var bytes = Enumerable.Range(0, cleanString.Length)
                 .Where(x => x % 2 == 0)
                 .Select(x => Convert.ToByte(cleanString.Substring(x, 2), 16))
                 .ToArray();

  return System.Windows.Media.Color.FromArgb(bytes[0], bytes[1], bytes[2], bytes[3]);
}

これを呼び出すだけで、ストロークを保存できます

SaveStrokes("filename", myInkPresenter.StrokeCollection);

そして、このように呼び出して、保存されたストロークを再描画します

LoadStrokes("filename", myInkPresenter);
于 2013-05-16T22:39:45.143 に答える
0

答えはノーのようです。:-/

Jeff Wilcox は、シリアル化、保存、復元できるオブジェクトを作成することを提案しています。

于 2013-05-16T12:07:44.323 に答える