我有一个InkPresenter并使用InkPresenter.Strokes.Add(Stroke)添加 Strokes 。之后,我想将 InkPresenter 序列化/保存到文件系统或数据库。Ink.Strokes 是StrokeCollection的类型, MSDN 说有针对此问题的 Save(Stream) 方法。在 Windows Phone 上,似乎缺少此功能。
也许,还有另一种方法来序列化和反序列化 InkPresenter 控件。
我有一个InkPresenter并使用InkPresenter.Strokes.Add(Stroke)添加 Strokes 。之后,我想将 InkPresenter 序列化/保存到文件系统或数据库。Ink.Strokes 是StrokeCollection的类型, MSDN 说有针对此问题的 Save(Stream) 方法。在 Windows Phone 上,似乎缺少此功能。
也许,还有另一种方法来序列化和反序列化 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);
}
}
}
Since colors are going to be saved in Hex format you'll need a function to convert that to a color enum:
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]);
}
Now you can simply call this to save the strokes
SaveStrokes("filename", myInkPresenter.StrokeCollection);
And call it like this to redraw the saved strokes
LoadStrokes("filename", myInkPresenter);
答案似乎是否定的。:-/
Jeff Wilcox 建议您创建一个可以序列化、存储然后从中恢复的对象。