1
我有一個UWP應用程序在其中一個頁面上使用InkCanvas
。當用戶離開此頁面並返回時,StrokeContainer
仍將包含所有筆觸,但畫布不會顯示它們,因此畫布對用戶而言看起來爲空。UWP InkCanvas在OnNavigated上還原筆畫爲
我看到很多樣本顯示筆畫的保存和加載。我只想實現在容器內部始終顯示筆劃。我找不到任何「重繪」機制或類似的東西。
我有一個UWP應用程序在其中一個頁面上使用InkCanvas
。當用戶離開此頁面並返回時,StrokeContainer
仍將包含所有筆觸,但畫布不會顯示它們,因此畫布對用戶而言看起來爲空。UWP InkCanvas在OnNavigated上還原筆畫爲
我看到很多樣本顯示筆畫的保存和加載。我只想實現在容器內部始終顯示筆劃。我找不到任何「重繪」機制或類似的東西。
解決方案是在離開視圖之前將筆畫存儲在本地文件中,並在您返回屏幕時重新加載它們。首先,我添加一個新的擴展級爲使其更易於處理的頁面的邏輯:
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
@清道夫我找到了解決這個問題的辦法。但要回答你的問題:我使用NavigateTo進行導航,因爲它是默認行爲。但是當我在NavigationService中使用GoBack時,StrokeContainer包含所有筆畫,但畫布不會自動重繪它們。 – sprinter252