【问题标题】:UWP InkCanvas restore strokes on OnNavigatedToUWP InkCanvas 在 OnNavigatedTo 上恢复笔触
【发布时间】:2017-01-13 20:02:37
【问题描述】:

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

我看到很多示例显示了笔画的保存和加载。我只是想实现笔画一直显示在容器内。我找不到任何“重绘”机制或类似的东西。

【问题讨论】:

  • StrokeContainer 仍将包含所有笔划”是什么意思?你是如何在页面之间导航的?你能分享一下你现在使用的代码吗?
  • @Scavenger 我找到了解决这个问题的方法。不过要回答您的问题:我使用 NavigateTo 进行导航,因为它是默认行为。但是当我在 NavigationService 中使用 GoBack 时,StrokeContainer 包含所有笔划,但画布不会自动重绘它们。

标签: c# uwp windows-10-universal


【解决方案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;
    }
}

然后在页面内部假设我们有一个名为myCanvasInkCanvas,我们会将所有内容存储在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);
    }
}

这对我来说效果很好,即使我仍然认为这种方法有点奇怪。

【讨论】:

    猜你喜欢
    • 2017-11-27
    • 1970-01-01
    • 2016-07-23
    • 2018-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多