2010-08-16 73 views
3

我在Windows Phone 7中有一個簡單的用戶控件,我想從用戶控件構造函數訪問querystring集合。我嘗試了很多方法,似乎無法獲取包含XAML的查詢字符串集合。如何從用戶控件訪問Windows Phone 7中的QueryString

本質上,我導航到頁面,我的用戶控件將訪問查詢字符串值將值寫回接口。

我是否缺少添加程序集或引用?

回答

7

我不確定你應該試圖從頁面的構造函數獲取信息,因爲每次登錄此頁面時都不會必要地調用它。更好的方法是覆蓋從PhoneApplicationPage繼承的OnNavigatedTo方法。仔細查看一下你的問題,你可能會試圖在嵌入頁面的控件中做這件事,在這種情況下,你需要進入Page來獲取導航信息。

無論如何,頁面中的NavigationContext屬性都有一個QueryString參數,您可以使用該參數來訪問您之後的信息。

下面的示例假設我有一個瀏覽這個網頁時,在查詢字符串名爲「消息」參數:

public partial class MyPage : PhoneApplicationPage 
{ 
    // Constructor 
    public MyPage() 
    { 
     InitializeComponent(); 
    } 

    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e) 
    { 
     base.OnNavigatedTo(e); 
     String navigationMessage; 
     if (NavigationContext.QueryString.TryGetValue("Message", out navigationMessage)) 
     { 
      this.textBlock1.Text = navigationMessage; 
     } 
    } 
} 
+0

我認爲這是行不通的,因爲我在用戶控件中,而不是像在類定義頭中引用的PhoneApplicationPage。這就是訣竅。我似乎無法在UserControl內訪問NavigationContent上的任何內容。 Page/XAML級別,沒有問題。在UserControl中,什麼都沒有。 – 2010-08-18 19:10:55

0

比較遺憾的是 - 我開始到那裏,並感謝澄清。你最好的選擇就是從你的控件中找出頁面的可視樹,然後你可以在NavigationContext中找到它。在下面的示例中,我在頁面中的自定義控件上有一個按鈕,它的click事件找到了nav上下文並查找了某個導航參數 - 我無法從問題或後續事件中看出什麼會驅動控件以「想要」來查找查詢字符串的內容。

(請注意有關從構造函數獲得信息如下下面的代碼)

public partial class WindowsPhoneControl1 : UserControl 
{ 
    public WindowsPhoneControl1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     GetTheQueryString(); 
    } 

    private void GetTheQueryString() 
    { 
     var result = "No Joy"; 
     var page = FindRootPage(this); 
     if (page != null) 
     { 
      if (page.NavigationContext.QueryString.ContainsKey("Param")) 
      { 
       result = page.NavigationContext.QueryString["Param"]; 
      } 
     } 
     queryStringText.Text = result; 
    } 

    private static PhoneApplicationPage FindRootPage(FrameworkElement item) 
    { 
     if (item != null && !(item is PhoneApplicationPage)) 
     { 
      item = FindRootPage(item.Parent as FrameworkElement); 
     } 
     return item as PhoneApplicationPage; 
    } 
} 

請注意,這並不會因爲XAML中是如何工作的構造函數工作... XML標記驅動構造函數是稱爲,然後按照指示設置屬性,然後將其作爲子/物品/等添加到其容器中。如果你確實需要使用這種「走上樹」的方法,儘快得到上下文,處理控件的加載事件,到時候控件確實有一個父母和一棵樹,可以走...

public WindowsPhoneControl1() 
    { 
     InitializeComponent(); 
     Loaded += WindowsPhoneControl1_Loaded; 
    } 

    private void WindowsPhoneControl1_Loaded(Object sender, RoutedEventArgs e) 
    { 
     GetTheQueryString(); 
    } 
0

我會將一個屬性添加到UserControl子類中,該子類將由OnNavigatedTo()方法中的頁面設置。