【问题标题】:Equivalent of includes in wp7 sl?相当于 wp7 sl 中的包含?
【发布时间】:2012-04-25 07:09:22
【问题描述】:

当你在 windows phone 中设计一个相对较大的应用程序时,通过 Uris 导航有点痛苦,所以我写了一个这样的简单方法:

void Navigate(string Frame)
{
       NavigationService.Navigate(new Uri(string.Format("/{0}.xaml", 0), UriKind.Relative));
}

问题是,我想将此代码包含在所有将进行导航的 PhoneApplicationPages 中,但是我想知道复制和粘贴是否是唯一的选择,我通常会尝试让我的页面派生自一个类它具有方法并从基类派生,但这将是另一个痛苦,因为PhoneApplicationPages 是部分类。有没有其他更好的方法来实现这一点,还是我应该复制和粘贴?

谢谢。

【问题讨论】:

    标签: c# windows-phone-7 navigation


    【解决方案1】:

    我没有发现任何问题。

    创建您的基础 PhonePage:

    public class PhoneApplicationPageBase : PhoneApplicationPage
        {
            public void Navigate()
            {
    
            }
            // Others methods
        }
    

    在您的网页中源自:

    public partial class Page1 : PhoneApplicationPageBase
        {
            public Page1()
            {
                InitializeComponent();
            }
        }
    

    在 xaml 中也是如此:

    <my:PhoneApplicationPageBase
        x:Class="Views.Page1"
        ...>
    
    </my:PhoneApplicationPageBase>
    

    或更多。您可以创建扩展方法。

     public static class Ext
        {
            public static void Navigate(this Page page, string view)
            {
    
            }
        }
    

    然后使用this.Navigate("Page2.xaml")

    【讨论】:

    • 这样做的问题是我还必须修改所有生成的g.i.cs 以从我的自定义类派生。并且使用扩展方法将导致我也为所有类编写扩展方法,这与复制和粘贴相同。没有?
    • 没有。扩展方法将适用于所有 Phone 对象。
    • 关于生成的g.i.cs...不用自己改,IDE会做的。
    【解决方案2】:

    您可以将方法拉出到静态类中,然后将调用页面作为引用传递;

    public static class Navigator
    {
        public static void Navigate(Page page, string frame)
        {
            page.NavigationService.Navigate(new Uri(string.Format("/{0}.xaml", frame), UriKind.Relative));
        }
    }
    

    然后你只需像这样调用:

    Navigator.Navigate(this, "NewPage");
    

    【讨论】:

      【解决方案3】:

      我同意 Roman 的观点,即从基本页面派生的过程在最坏的情况下是乏味的:一些字符串替换,就完成了。

      我有自己的小型 mvvm 工具包,其中包括一个导航器服务,它(基本上)将 uri 映射到页面类。在应用程序启动时,您将页面类映射到 uri,然后您可以通过指定类简单地导航到视图 (uri)。

      即,在应用构造函数中注册视图:

          ViewNavigator.RegisterView<IMainView>(new Uri("/Pages/MainView.xaml", UriKind.RelativeOrAbsolute));
      

      您可以通过代码导航到页面

          ViewNavigator.Instance.NavigateTo<IMainView>();
      

      整个工具包比这里描述的更先进(支持参数;包括允许您通过 XAML 进行相同操作的行为),但我希望您能大致了解。

      【讨论】:

      • 我真的不知道这段代码的性能会有多好,但对我来说看起来并不简单。实例引用是静态的吗? ViewNavigator 何时创建?等等……
      • 我不想详细说明,只是为了展示这个想法。在这种情况下,ViewNavigator 是一个单例。 “type-to-uri”解析是一个简单的基于字典的操作,因此应该几乎是即时的,并且考虑到该操作在导航到新页面的整个过程中的相对比例,几乎为零。但更重要的是,我想展示一些关于如何在代码中摆脱字符串常量的想法,并用更安全的方法替换它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-19
      • 2014-09-29
      • 2021-08-20
      • 2012-12-03
      相关资源
      最近更新 更多