我有一个InkPresenter并使用InkPresenter.Strokes.Add(笔画)将笔触添加到它。之后,我想序列化/保存InkPresenter到文件系统或数据库。 Ink.Strokes是StrokeCollection的类型,MSDN表示存在此问题的Save(Stream)方法。在Windows Phone上,似乎缺乏这种功能。Windows Phone - 序列化/保存InkPresenter控件
也许,还有另一种序列化和反序列化InkPresenter控件的方法。
我有一个InkPresenter并使用InkPresenter.Strokes.Add(笔画)将笔触添加到它。之后,我想序列化/保存InkPresenter到文件系统或数据库。 Ink.Strokes是StrokeCollection的类型,MSDN表示存在此问题的Save(Stream)方法。在Windows Phone上,似乎缺乏这种功能。Windows Phone - 序列化/保存InkPresenter控件
也许,还有另一种序列化和反序列化InkPresenter控件的方法。
在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);
答案似乎是否定的。 : -/
Jeff Wilcox suggests您创建了一个可以序列化,存储并从中恢复的对象。
我已经阅读过这篇文章,但是我不知道该怎么做? – 2013-05-16 18:20:22
这真是一个很好的解决方案!你在哪里建议将序列化存储在数据库或文件系统中? – 2013-05-17 16:39:19
存储它并不重要,它们都很好。 – 2013-05-17 16:43:09
好的,谢谢你的帮助! :) – 2013-05-17 17:16:26