Решение этого заключается в том, чтобы сохранить штрихи в локальном файле, прежде чем покинуть представление и перезагрузить их, когда вы вернетесь на экран. Сначала я добавить новый Extension-класс для создания его более легким для обработки логики в страницах:
public static class InkCanvasExtensions
{
public static async Task RestoreStrokesAsync(this InkCanvas inkCanvas, StorageFolder folder, string fileName)
{
try
{
var file = folder.GetFileAsync(fileName);
using (var stream = await file.OpenAsync(FileAccessMode.Read))
{
using (var inputStream = stream.GetInputStreamAt(0))
{
await inkCanvas.InkPresenter.StrokeContainer.LoadAsync(inputStream);
}
}
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
public static async Task<bool> StoreStrokesAsync(this InkCanvas inkCanvas, StorageFolder folder, string fileName)
{
try
{
var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.ReplaceExisting);
CachedFileManager.DeferUpdates(file);
using (var stream = await file.OpenAsync(FileAccessMode.ReadWrite))
{
using (var outputStream = stream.GetOutputStreamAt(0))
{
await inkCanvas.InkPresenter.StrokeContainer.SaveAsync(outputStream);
await outputStream.FlushAsync();
}
}
var status = await CachedFileManager.CompleteUpdatesAsync(file);
return status == FileUpdateStatus.Complete;
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return false;
}
}
Тогда внутри страницы давайте предположим, что мы имеем InkCanvas
имя myCanvas
и мы будем хранить все в ApplicationData.Current.SharedLocalFolder
:
public partial class Signature
{
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
await myCanvas.RestoreStrokesAsync(ApplicationData.Current.SharedLocalFolder, "strokes.gif");
base.OnNavigatedTo(e);
}
protected override async void OnNavigatedFrom(NavigationEventArgs e)
{
await myCanvas.StoreStrokesAsync(ApplicationData.Current.SharedLocalFolder, "strokes.gif");
base.OnNavigatedFrom(e);
}
}
Это хорошо работает в моем случае, даже если я все еще думаю, что этот подход как-то странный.
Что значит «StrokeContainer» будет содержать все штрихи? Как вы перемещались между страницами? Не могли бы вы использовать код, который используете сейчас? – Scavenger
@Scavenger Я нашел решение этой проблемы. Однако, чтобы ответить на ваш вопрос: я перемещаюсь с помощью NavigateTo, поскольку это поведение по умолчанию. Но когда я использую GoBack в NavigationService, StrokeContainer содержит все штрихи, но холст не будет автоматически перерисовывать их. – sprinter252