Windows Phone 7 / Silverlight:如何进行导航?

时间:2010-10-31 18:32:11

标签: silverlight windows-phone-7

我正在开发一个Silverlight wp7应用。我不确定如何做导航。

我有几个PhoneApplicationPage个类,其中包含多个UserControl个。看起来我可以使用NavigationServicePhoneApplicationPage类导航,但不能导航UserControl类。那更好吗?一般模式是不是直接从UserControl导航,而是从PhoneApplicationPage处理它?<​​/ p>

目前,我有一系列内容分为几个部分。每个部分在PivotItem中都有自己的PivotControl。每个部分的内容都在ListBox中。我将ListBox包裹在UserControl中以提供更多功能/管理内容。但是,看起来我无法直接从这个类导航。

我可以删除包装器,直接将功能放在数据透视页面中。但是如果我想在我的应用程序的其他地方重复内容列表呢?

或者,当NavigationServiceUserControl构建时,我将PhoneApplicationPage传递给{{1}}。

4 个答案:

答案 0 :(得分:2)

在WPF中,这很简单:您可以在NavigationService上调用静态方法来获得答案:NavigationService.GetNavigationService(this)

不幸的是,这似乎在WP7中不可用。

相反,我想出了这个黑客......它像罪一样丑陋......希望有更好的东西。可能,至少,你可以想出一些更漂亮的东西。至少做一些空检查......

var service = ((Application.Current as App).RootFrame.Content as Page).NavigationService;

答案 1 :(得分:2)

在WP7中,RootVisual始终为PhoneApplicationFrame,由于NavigationServiceFrame(或PhoneApplicationFrame)几乎所有方法/属性(故意)共享,因此可以做到这一点:

(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(...whatever...);

答案 2 :(得分:0)

我为此制作了一个自定义UserControl:

public class UserControlWithNavigation :UserControl
{
    public event EventHandler NavigateToPageEvent;

    public void NavigateToPage(Uri uri)
    {             
        var e = new NavigationEventArgs(null, uri);
        if (NavigateToPageEvent != null)
            NavigateToPageEvent(this, e);
    }
}

XAML使用自定义UserControl类:

<common:UserControlWithNavigation    
  xmlns:common="clr-namespace:NameSpace;assembly=AssemblyName"

并在我的页面

 MyUserControl.NavigateToPageEvent += (s, e) =>
 {
      NavigationService.Navigate(((NavigationEventArgs)e).Uri);
 };

如您所见,您必须为UserControl提供一个名称(上例中为MyUserControl

答案 3 :(得分:0)

我在http://www.geoffhudik.com/tech/2010/10/10/another-wp7-navigation-approach-with-mvvm.html处使用MVVM Light进行了导航示例。它可以使用一些重构,有些人更喜欢将一些导航辅助函数放在除基页之外的另一个类中。这很容易做到,但它可能会提供一些想法。