Как и в случае с Джеффом, на телефоне 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);
Это действительно хорошее решение! Где вы предлагаете хранить сериализацию, в базе данных или в файловой системе? –
Это не имеет большого значения, где вы его храните, они оба хороши. –
Хорошо, спасибо вам за помощь! :) –