Windows Phone - Сериализация / Сохранить элемент управления InkPresenter

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

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

2 ответа

Решение

Как и в посте Джеффа, на 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);

Ответ, кажется, нет.:-/

Джефф Уилкокс предлагает создать объект, который можно сериализовать, сохранить, а затем восстановить.

Другие вопросы по тегам