2013-05-13 53 views
2

我有一个InkPresenter并使用InkPresenter.Strokes.Add(笔画)将笔触添加到它。之后,我想序列化/保存InkPresenter到文件系统或数据库。 Ink.Strokes是StrokeCollection的类型,MSDN表示存在此问题的Save(Stream)方法。在Windows Phone上,似乎缺乏这种功能。Windows Phone - 序列化/保存InkPresenter控件

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

回答

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

由于颜色将被保存在十六进制格式,你需要一个函数将其转换成一个颜色枚举:

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

这真是一个很好的解决方案!你在哪里建议将序列化存储在数据库或文件系统中? – 2013-05-17 16:39:19

+0

存储它并不重要,它们都很好。 – 2013-05-17 16:43:09

+0

好的,谢谢你的帮助! :) – 2013-05-17 17:16:26

0

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

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

+0

我已经阅读过这篇文章,但是我不知道该怎么做? – 2013-05-16 18:20:22