2016-12-28 42 views
1

我有一個UWP應用程序在其中一個頁面上使用InkCanvas。當用戶離開此頁面並返回時,StrokeContainer仍將包含所有筆觸,但畫布不會顯示它們,因此畫布對用戶而言看起來爲空。UWP InkCanvas在OnNavigated上還原筆畫爲

我看到很多樣本顯示筆畫的保存和加載。我只想實現在容器內部始終顯示筆劃。我找不到任何「重繪」機制或類似的東西。

+0

你是什麼意思「StrokeContainer'仍然包含所有筆畫」?你是如何瀏覽頁面的?你能分享你現在使用的代碼嗎? – Scavenger

+0

@清道夫我找到了解決這個問題的辦法。但要回答你的問題:我使用NavigateTo進行導航,因爲它是默認行爲。但是當我在NavigationService中使用GoBack時,StrokeContainer包含所有筆畫,但畫布不會自動重繪它們。 – sprinter252

回答

1

解決方案是在離開視圖之前將筆畫存儲在本地文件中,並在您返回屏幕時重新加載它們。首先,我添加一個新的擴展級爲使其更易於處理的頁面的邏輯:

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); 
    } 
} 

在我的情況下,即使我仍然認爲這種方法很奇怪,這種方法也很好。