2010-09-16 76 views
15

如果我爲此用戶控件內:Silverlight - 如何從用戶控件導航到普通頁面?

NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative)); 

它說這個錯誤:

一個對象引用是所必需的非靜態字段,方法或屬性「System.Windows.Navigation。 NavigationService.Navigate(的System.Uri)」

謝謝


好吧,我解決了通過正常的頁面作爲參數傳遞給用戶有限公司ntrol,所以我可以得到NavigationService。

+0

我試圖從瓦利德的解決方案。這解決了我的... – franklins 2011-06-08 02:39:00

+0

我一直在尋找這個多年的解決方案。導航框架是MVVM開發的磚牆。我發現的唯一解決方案是我拒絕使用的令人厭惡的黑客!我不希望我的網頁有任何導航知識! – Jordan 2011-12-12 16:29:20

回答

1

NavigationService是Silverlight中頁面對象的屬性,這就是您遇到此錯誤的原因。它不是Silverlight中UserControl的屬性。

以下是一些可以解決您所看到問題的選項。

  1. 將usercontrol當作控件處理。給它一個它點擊按鈕時會觸發的事件。該頁面可以偵聽該事件並在觸發時處理導航。

  2. 您可以允許您的頁面訪問其父項,也可以將NavigationService從頁面傳遞給usercontrol。

  3. 您也可以使用消息傳遞進行設置,但這會更復雜。許多MVVM框架都具有消息傳遞功能。 MVVM Light有它。

+0

好吧,在UserControl中,我有一個按鈕,當它被點擊時,我導航到另一個頁面。 – Alan 2010-09-16 20:31:19

+0

您可以使用HyperlinkBut​​ton而不是常規按鈕嗎? – 2010-09-16 20:41:27

+0

我會說,不要從控件導航,而是給頁面一個事件,並允許頁面導航。您的控件應該只提供輸入而不是控制導航。 – 2010-09-18 02:55:50

-1
 if(Application.Current.RootVisual is Page) 
     { 
      ((Page) (Application.Current.RootVisual)).NavigationService.Navigate(uri); 
     } 
12

我通常使用的事件處理程序。例如: 在您的用戶控制,定義類似

public event EventHandler goToThatPage; 

,你會在你的控制敵人,例如調用是這樣的:在您的MainPage.xaml.cs中的構造

goToThatPage(this, new EventArgs()); 

然後(如果用戶控件包含在那裏),您將定義:

uxControlName.goToThatPage+= new EventHandler(ControlGoToThatPage); 
在MainPage.xaml.cs中

和地方你finaly聲明的動作來完成:

void ControlGoToThatPage(object sender, EventArgs e) 
    { 
     this.NavigationService.Navigate(new Uri("/Pages/ThatPage.xaml", UriKind.Relative)); 
    } 
+0

謝謝。這幫了我一個解決方案...是一個很好的,完整的方式來做到這一點! – Stonetip 2011-04-26 01:52:50

50
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri); 
+0

這裏是什麼PhoneApplicationFrame?在我的代碼中,我有調用Main.xaml的App.xaml Main.xaml是UserControl,我想從那裏導航。 – 2012-12-08 21:05:03

+0

該代碼適用於Windows Phone的Silverlight – Waleed 2012-12-09 15:27:33

+3

爲什麼此答案未標記爲正確答案。 – URAndroid 2014-04-03 14:17:54

0
((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame")) 
    .Navigate(new Uri("Page Name", UriKind.Relative)); 
0

我知道這是老了,但我也是在一個Silverlight應用程序一樣的情況。我想要做類似於Deepak的回答,但是我無法想象它爲什麼在我的情況下不起作用。

原來我需要調用刷新,而不是導航;因爲我原本以爲導航會重新加載頁面,如果URI與當前頁面相同。原諒我的初學者。

(((Application.Current.RootVisual as MainPage).ContentFrame as Frame).Content as Page).NavigationService.Refresh(); 
2

下面是Windows Phone的8 Silverlight的另一種解決方案:

public Page Page { get; set; } 

this.Loaded += delegate 
{ 
    Page = (Application.Current.RootVisual as Frame).Content as Page; 
}; 

Page.NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative)); 
相關問題