2010-10-31 94 views
4

我正在开发一个Silverlight wp7应用程序。我不确定如何做导航。Windows Phone 7/Silverlight:如何做导航?

我有几个PhoneApplicationPage类,其中包含几个UserControl s。看起来我可以使用NavigationService来从PhoneApplicationPage类导航,但不能使用UserControl类。这是更可取的吗?一般模式不是直接从UserControl导航,而是从PhoneApplicationPage处理它?

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

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

或者,我将NavigationService传递给UserControl,当它由PhoneApplicationPage构造时。

回答

2

在WPF中,它很简单:您可以拨打NavigationService的静态方法来获得您的答案:NavigationService.GetNavigationService(this)

不幸的是,这似乎并不适用于WP7。

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

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

我给这个自定义用户控件:

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)的名称

2

在WP7中,RootVisual始终是一个PhoneApplicationFrame,由于NavigationServiceFrame(或PhoneApplicationFrame)分享几乎所有的方法/属性(有意的),你可以这样做:

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