2010-10-31 95 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...);