2013-05-13 2 views
2

У меня есть InkPresenter и добавить Strokes на него с помощью InkPresenter.Strokes.Add (Stroke). После этого я хочу сериализовать/сохранить InkPresenter в файловой системе или базе данных. Ink.Strokes - это тип StrokeCollection, а MSDN говорит, что для этой проблемы существует метод Save (Stream). На Windows Phone, похоже, отсутствует эта функциональность.Windows Phone - Сериализация/Save InkPresenter управления

Возможно, есть еще один способ сериализации и десериализации элемента управления InkPresenter.

ответ

3

Как и в случае с Джеффом, на телефоне Windows единственный способ сделать это - иметь свой собственный тип, который хранит штрихи, а затем вы можете сохранить это в изолированном хранилище, а затем можете загрузить его и в основном «переиграть» штрихи. Или вы можете просто сохранить 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); 
    } 
    } 
} 

Поскольку цвета будут сохранены в формате Hex вам нужна функция, чтобы преобразовать его в цвете перечисления:

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

Это действительно хорошее решение! Где вы предлагаете хранить сериализацию, в базе данных или в файловой системе? –

+0

Это не имеет большого значения, где вы его храните, они оба хороши. –

+0

Хорошо, спасибо вам за помощь! :) –

0

Ответ, похоже, нет. : -/

Jeff Wilcox suggests что вы создаете объект, который вы можете сериализовать, сохранить и затем восстановить.

+0

Я уже прочитал эту тему, но у меня нет идеи, как это сделать? –

Смежные вопросы