我有一個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