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

Windows phone 8 Windows Phone-序列化/保存InkPresenter控件,windows-phone-8,drawing,windows-phone,stroke,Windows Phone 8,Drawing,Windows Phone,Stroke,我有一个InkPresenter,并使用InkPresenter.Strokes.add(Stroke)向其添加笔划。之后,我想将InkPresenter序列化/保存到文件系统或数据库。笔划是一种类型,MSDN说有保存(流)方法来解决这个问题。在windows Phone上,似乎缺少此功能 也许,还有另一种方法可以序列化和反序列化InkPresenter控件。答案似乎是否定的:-/ 创建一个可以序列化、存储然后从中恢复的对象 正如Jeff在文章中所说,在windows phone上实现这一点的唯

我有一个InkPresenter,并使用InkPresenter.Strokes.add(Stroke)向其添加笔划。之后,我想将InkPresenter序列化/保存到文件系统或数据库。笔划是一种类型,MSDN说有保存(流)方法来解决这个问题。在windows Phone上,似乎缺少此功能


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

答案似乎是否定的:-/


创建一个可以序列化、存储然后从中恢复的对象

正如Jeff在文章中所说,在windows phone上实现这一点的唯一方法是使用您自己的类型存储笔划,然后您可以将其保存到独立的存储中,然后您可以加载它并基本上“重放”笔划。或者您可以将StrokeCollection保存为格式化字符串

基本上,每个笔划由一种颜色和一组点组成。例如,通过这种方式,您可以将
StrokeCollection
存储为字符串集合,格式如下:

Color | X1,Y1$X2,Y2$X3,Y3
——表示一个笔划

这样,您就可以编写一个函数来接受笔划集合和文件名,它可以保存您的
StrokeCollection

public void SaveStrokes(字符串文件名,StrokeCollection StrokeCollection){
var isf=IsolatedStorageFile.GetUserStoreForApplication();
var stream=isf.CreateFile(文件名);
使用(var writer=新的StreamWriter(流)){
foreach(strokeCollection中的变量笔划){
writer.WriteLine(String.Format(“{0}{1}”),
stroke.DrawingAttribute.Color.ToString(),
String.Join(“$”,stroke.StylusPoints.Select(p=>String.Format(“{0},{1})”,p.X,p.Y()));
}
}
}
现在,您只需要一个函数来加载并显示笔划。加载通过上述方法保存的笔划集合的加载函数可以如下所示:

public void LoadStrokes(字符串文件名,InkPresenter-InkPresenter){
var isf=IsolatedStorageFile.GetUserStoreForApplication();
var stream=isf.OpenFile(文件名,FileMode.Open);
使用(变量读取器=新的流读取器(流)){
var strokes=reader.ReadToEnd().Split(新字符[]{'\r','\n'},StringSplitOptions.RemoveEmptyEntries);
foreach(笔划中的变量笔划){
var strokeParams=笔划分割(“|”);
var myStroke=新笔划();
myStroke.DrawingAttributes.Color=HexToColor(strokeParams[0].ToString());
var pointList=strokeParams[1]。拆分(“$”);
foreach(点列表中的var pointPair){
var pointPairList=pointPair.Split(',');
var x=Convert.ToDouble(pointPairList[0]);
var y=Convert.ToDouble(pointPairList[1]);
添加(新StylusPoint(x,y));
}
inkPresenter.Strokes.Add(myStroke);
}
}
}
由于颜色将以十六进制格式保存,因此需要一个函数将其转换为颜色枚举:

public System.Windows.Media.Color HexToColor(字符串hextString){
字符串cleanString=hexString.Replace(“-”,string.Empty)。子字符串(1);
var bytes=Enumerable.Range(0,cleanString.Length)
。其中(x=>x%2==0)
.Select(x=>Convert.ToByte(cleanString.Substring(x,2),16))
.ToArray();
返回System.Windows.Media.Color.FromArgb(字节[0],字节[1],字节[2],字节[3]);
}
现在您可以简单地调用它来保存笔划

SaveStrokes(“文件名”,myInkPresenter.StrokeCollection);
并这样调用它来重新绘制保存的笔划

LoadStrokes(“文件名”,myInkPresenter);

我已经读过这篇文章了,但我不知道怎么做?这是一个非常好的解决方案!您建议将序列化存储在哪里,数据库还是文件系统中?存储在哪里并不重要,它们都很好。