2016-12-28 15 views
1

私はそのページにInkCanvasを使用するUWPアプリケーションを持っています。ユーザーがこのページを離れて再び戻ると、StrokeContainerにはすべてのストロークが含まれますが、キャンバスには表示されないため、キャンバスはユーザーに空に見えます。UWP InkCanvasは、OnNavigatedToのストロークを復元します

ストロークの保存と読み込みを示すサンプルが多数見つかりました。ストロークがコンテナの中に常に表示されるようにしたいだけです。私は「再描画」 - 機構などを見つけることができませんでした。

+0

「StrokeContainerにはまだすべてのストロークが含まれています」とはどういう意味ですか?どのようにページ間を移動しましたか?あなたは現在使用しているコードを共有できますか? – Scavenger

+0

@Scavengerこの問題の解決策を見つけました。あなたの質問に答えるには: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; 
    } 
} 

次に、ページ内の我々はmyCanvasという名前InkCanvasを持っており、私たちは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); 
    } 
} 

私の場合は、このアプローチが何となく奇妙だと思っても、これはかなりうまくいきます。

関連する問題