windows存储应用程序页面刷新

时间:2014-01-08 09:19:37

标签: c# windows windows-store-apps winrt-xaml windows-store

我是Windows商店应用程序开发的新手,目前我正在开发新闻应用程序,我想刷新页面以获取新闻更新。我说我开发了一个默认布局,它是在启动一个项目时给我们的,因为一旦页面被创建,我就会丢失页面字典。它得到保存,所以有一种刷新页面的方法!当应用程序第一次运行时调用LoadState方法,当单击刷新时,视图变得清晰但根据我的知识将所有数据保存在字典中是否有一种简单的方法可以清除组内的数据并调用方法以便新数据将被填写。有人请指导我完成相关步骤

  protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
    {
       var sampleDataGroups = SampleDataSource.GetGroups((String)navigationParameter);
       this.DefaultViewModel["Groups"] = sampleDataGroups;
    }

   private void refresh(object sender, RoutedEventArgs e)
    {
        this.DefaultViewModel.Clear();

    }

2 个答案:

答案 0 :(得分:2)

这个问题没有很好的答案。但是,让我谈谈你的一些概念。当然,没有刷新,其原因很多。刷新可能会在某天添加到框架中,但它现在有问题。

考虑导航服务

在您的应用中导航的一种好方法是将此工作卸载到NavigationService类。这是一个简单的类,有(例如)自定义GotoAppHub()GotoItemDetail(Item)方法。

这些方法的目的不是因为导航很困难,而是因为导航可以集中。它可以检查&amp;创建Frame;而不是将此错误地留在App.xaml.cs.

如果您的视图模型想要导航到某个页面,它只需调用NavigationService.GotoItemDetail(item);即可执行此操作,并传递该项目。这很聪明,有几个原因,让我来谈谈你。

这很聪明的第一个原因是因为你可能根本不想导航。在某些情况下,导航依赖于正在加载的数据或具有权限的用户。使用导航服务可以集中导航逻辑和验证操作所需的测试。

这是智能的第二个原因是它允许您保留传递给导航请求的参数。请记住,Frame不会序列化自定义的复杂类型。因此,在这种情况下传递item是一种不好的做法。导航服务可以将此参数保留在某个位置,以便目标视图模型可以获取它。此外,它可以将其保留为您的Refresh()。

考虑静态存储库类

加载视图模型时,它不必知道以前的视图模型导致它加载的内容。相反,视图模型应该知道它应该做什么。为了完成它的工作,它需要数据。每个视图模型都可以使用存储库类来请求&#34;当前&#34;记录。当导航发生时,导航服务将设置当前记录。此外,当没有当前记录时,存储库类知道该怎么做,并在需要时获取它。

除了保存对当前记录的引用之外,存储库类还了解持久性。我的意思是,当应用程序加载时,它知道如何填充列表。当应用程序暂停时,它知道如何将数据保存到文件或Web服务,或者您使用的任何内容。因此,视图模型不知道这一点,因此更简单,更容易维护。

考虑重新加载()方法

在导航服务中,您需要重新加载方法。更重要的是,只有在导航服务中,重载方法才能最有效,因为导航服务知道当前的type和当前参数值。导航服务可以将这些值存储在本地字段中,重载方法可以简单地重复导航。

但请记住后台堆栈。这就像浏览器的导航一样,重复导航将意味着同一页面将存在两次,导航服务中的GoBack()方法将不再返回,直到您返回两次。解决方案很简单,只需记住使用Services.NavigationService.Instance.Frame.BackStack.Remove()删除。

请记住加载费用

有时,当页面加载时,加载UI会产生相当大的成本。这是因为无论你做什么都不是微不足道的。调用Reload()将导致页面的加载重复。这是您无法克服的成本。但是,可能存在依赖于应该绕过的页面加载。例如,您可以在加载页面时启动Web服务操作 - 并且不应重复该操作。这取决于您保留一个静态布尔值,表示页面已加载。但重要的是你不要忘记它。

存储库的另一个好处

上面几段我提到你的导航服务是能够记住上次传递的重载方法工作的参数。如果您有一个内部规则,只有导航服务可以写入并发类,那么您的导航服务并不需要记住。它只需要记住最后一个导航类型。这是因为并发类已经具有对传入的项的引用。但是,这并不总是有用的。有时会调用reload来丢弃当前的更改,这意味着需要重新加载当前项目或者必须刷新当前更改。这一切都必须是定制的,但如果我没有提及它,我会感到很难过。

<强>结论

这应该仅作为建议。话虽如此,我在这里描述了市场上大量成功的大型WPF和Windows应用程序。使用MVVP模式,导航的服务模式,并发的存储库模式 - 它都得到了很好的证明。但你是开发人员。最后,你应该选择什么是最好的。

如果你不喜欢其中的任何一个,你可以这样做:

public bool Reload()
{
    if (!this.Frame.BackStack.Any())
        return false;
    var current = this.Frame.BackStack.First();
    this.Frame.BackStack.Remove(current);
    return this.Frame.Navigate(current.SourcePageType, current.Parameter);
}

祝你好运!

答案 1 :(得分:0)

怎么样:

private string parameter;

protected override void LoadState(Object navigationParameter, Dictionary<String, Object> pageState)
{
   parameter = (string)navigationParameter;
   reloadData();
}

private void reloadData() 
{
   var sampleDataGroups = SampleDataSource.GetGroups(parameter);
   this.DefaultViewModel["Groups"] = sampleDataGroups;
}

private void refresh(object sender, RoutedEventArgs e)
{
   reloadData() 
}