2016-12-28 3 views
1

У меня есть приложение UWP, которое использует InkCanvas на одной из его страниц. Когда пользователь покинет эту страницу, а затем вернется к ней, StrokeContainer по-прежнему будет содержать все штрихи, но холст не отобразит их, чтобы изображение выглядело пустым для пользователя.UWP InkCanvas восстанавливает штрихи на OnNavigatedTo

Я видел много образцов, показывающих сохранение и загрузку штрихов. Я просто хочу добиться того, чтобы штрихи отображались все время, пока они находятся внутри контейнера. Я не мог найти никакого «перерисования» -механизма или чего-то подобного.

+0

Что значит «StrokeContainer» будет содержать все штрихи? Как вы перемещались между страницами? Не могли бы вы использовать код, который используете сейчас? – Scavenger

+0

@Scavenger Я нашел решение этой проблемы. Однако, чтобы ответить на ваш вопрос: я перемещаюсь с помощью NavigateTo, поскольку это поведение по умолчанию. Но когда я использую GoBack в NavigationService, StrokeContainer содержит все штрихи, но холст не будет автоматически перерисовывать их. – sprinter252

ответ

1

Решение этого заключается в том, чтобы сохранить штрихи в локальном файле, прежде чем покинуть представление и перезагрузить их, когда вы вернетесь на экран. Сначала я добавить новый 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); 
    } 
} 

Это хорошо работает в моем случае, даже если я все еще думаю, что этот подход как-то странный.