UWP InkCanvas在OnNavigatedTo

时间:2016-12-28 09:53:56

标签: c# uwp windows-10-universal

我有一个UWP应用,在其中一个页面上使用InkCanvas。当用户离开此页面然后返回到该页面时,StrokeContainer仍将包含所有笔划,但画布不会显示它们,因此画布对用户看起来是空的。

我看到很多样本显示了笔画的保存和加载。我只是想实现它们在容器内的所有时间都显示笔划。我找不到任何“重绘”机制或类似的东西。

1 个答案:

答案 0 :(得分:1)

解决方法是在离开视图之前将笔划存储在本地文件中,并在返回到屏幕时重新加载它们。首先,我添加了一个新的Extension-Class,以便更轻松地处理页面中的逻辑:

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的{​​{1}},我们会将所有内容存储在myCanvas中:

ApplicationData.Current.SharedLocalFolder

即使我仍然认为这种方法在某种程度上是奇怪的,我的情况也很好。