2013-05-13 30 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