Windows Phone - 序列化/保存InkPresenter控件

时间:2013-05-13 17:44:05

标签: windows-phone-8 drawing windows-phone stroke

我有 InkPresenter 并使用 InkPresenter.Strokes.Add(Stroke)将Strokes添加到其上。之后,我想将InkPresenter序列化/保存到文件系统或数据库。 Ink.Strokes的类型为StrokeCollection,MSDN表示存在此问题的Save(Stream)方法。在Windows Phone上,似乎缺少此功能。

也许,还有另一种方法可以序列化和反序列化InkPresenter控件。

2 个答案:

答案 0 :(得分:3)

正如在杰夫的帖子中,在Windows手机上,唯一的方法是拥有自己的类型来存储笔画,然后你可以将其保存到隔离存储,然后你可以加载它并基本上“重放”笔画。或者您可以将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);
    }
  }
}

由于颜色将以十六进制格式保存,因此您需要一个函数将其转换为颜色枚举:

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);

答案 1 :(得分:0)

答案似乎是否定的。 : - /

Jeff Wilcox suggests您创建了一个可以序列化,存储然后从中恢复的对象。