【问题标题】:How to update Cached Page from an Asyn Task After Navigating to another Page?导航到另一个页面后如何从异步任务更新缓存页面?
【发布时间】:2014-06-27 14:56:49
【问题描述】:

当后台下载工作正在进行时,我正在从一个页面导航到另一个页面。 在第 1 页,我正在根据收到的进度更新进度条。 在导航到 第 2 页之前,我已经缓存了 Page1

但是当我们导航回到 Page1 时,即使我们已经更新了 Model 并使用 MVVM 方法通知了它,视图也没有更新。但是我们已经验证进度已经完成,文件已经下载。

我们正在使用下面的代码来缓存页面。

this.NavigationCacheMode = NavigationCacheMode.Enabled;

我想知道为什么视图没有更新,即使我们已经尝试更新它。如果我们没有导航到另一个页面,则会更新进度。所以我们确信它会在正常情况下工作,除了缓存。

请帮助解决这种情况。

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    清除缓存应该对您有所帮助

    在您的呼叫者页面中覆盖以下内容

    protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
    {
        if (e.Uri.ToString().Contains("/target"))
        {
            Frame parentFrame = (Frame) Parent;
            var cacheSize = parentFrame.CacheSize;
            parentFrame.CacheSize = 0;
            parentFrame.CacheSize = cacheSize;
        }
        base.OnNavigatingFrom(e);
    }
    

    用你想要的 url 替换 /target 或用你自己的逻辑替换条件,例如。在您更新视图模型或两者之后

    后面的想法是看看我们何时将navigating 设置为cached target 然后我们将帧的cache size 设置为0 这将有效地clear the cache 然后restore back 开始缓存的原始限制再次。

    注意此方法对NavigationCacheMode.Enabled有效,但对NavigationCacheMode.Required可能无效,因为它更难清除。

    【讨论】:

    • 我有一个疑问。我将 NavigationCacheMode 保持为已启用以实现一项要求。在第 1 页中,我正在下载一个文件并通知它的进度,所以清除缓存会突然下载文件吗?如果没有,进度条会更新到下载进度完成吗?
    • 我希望它不会中断文件下载,除非是用页面代码下载的,这也取决于下载的方法。到目前为止,我猜您正在使用页面来显示信息,而不是执行此类业务逻辑。试一试,看看这是否可以解决您的特定情况。如果没有,那么您是否可以为您的案例发布工作样本,以便我可以根据您的需求提出解决方案。
    • 试过了,但是影响下载进度。当我导航回第 1 页时,即使下载正在后台进行,进度也会关闭。
    • 我相信我们可以解决这个问题。您是否可以创建一个可以重现相同问题的工作示例?我可以看看,看看我们如何解决这个问题。
    【解决方案2】:

    最后我找到了一个变通的解决方案。我发现在导航回来时,只会再次调用 PageLoad。所以我在

    this.InitializeComponent();

    结果证明这是我的方案的一种解决方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2022-08-16
      • 1970-01-01
      相关资源
      最近更新 更多