2010-08-16 5 views
3

J'ai un contrôle utilisateur simple dans Windows Phone 7 et je souhaite accéder à la collection querystring à partir de l'éditeur Contrôles utilisateur. J'ai essayé beaucoup de manières et ne peux pas sembler obtenir accès à la collection de querystring de XAML contenant. Essentiellement je navigue vers la page et le contrôle de mon utilisateur va accéder à la valeur de chaîne de requête pour écrire la valeur à l'interface. Ai-je besoin d'ajouter un assemblage ou une référence ou quelque chose?Comment accéder à la QueryString dans Windows Phone 7 à partir d'un contrôle utilisateur

Répondre

7

Je ne suis pas sûr que vous devriez essayer d'obtenir les informations du constructeur de la page, car il ne sera pas nécessairement appelé chaque fois que vous atterrissez sur cette page. Une meilleure approche consiste à remplacer la méthode OnNavigatedTo héritée de PhoneApplicationPage. En regardant un peu plus attentivement votre question, vous essayez peut-être de le faire dans un contrôle intégré dans la page, auquel cas vous devez vous rendre à la page pour obtenir les informations de navigation. Quoiqu'il en soit, la propriété NavigationContext de la page possède un paramètre QueryString que vous pouvez utiliser pour accéder aux informations que vous recherchez.

L'exemple suivant suppose que j'ai un paramètre appelé « message » dans la chaîne de requête lorsque vous naviguez vers cette page:

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

Je pense que cela ne fonctionnera pas puisque je suis dans un UserControl et non une PhoneApplicationPage comme vous faites référence dans l'en-tête de définition de classe. C'est le truc. Je ne peux pas sembler avoir accès à n'importe quoi sur NavigationContent une fois dans un UserControl. Niveau Page/XAML, pas de problème. Dans le UserControl, rien. –

0

Désolé à ce sujet - j'ai commencé à y arriver, et merci pour la clarification. Votre meilleur pari est alors de monter l'arbre visuel de votre contrôle pour trouver la page, alors vous pouvez avoir à la NavigationContext. Dans mon exemple ci-dessous, j'ai un bouton sur un contrôle personnalisé dans la page, dont l'événement click trouve le contexte de navigation et cherche un certain paramètre de navigation - je ne pouvais pas dire à partir de la question ou de votre suivi "vouloir" trouver le contenu de la chaîne de requête.

(Remarque sur l'obtention d'informations de la cteur suit le code ci-dessous)

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; 
    } 
} 

Notez que cela ne fonctionnera pas du cteur à cause de la façon dont fonctionne Xaml ... la balise Xml entraîne le cteur être appelé, les propriétés sont définies comme indiqué, puis elles sont ajoutées en tant que enfant/élément/etc dans son conteneur. Si vous avez besoin d'obtenir le contexte dès que possible en utilisant cette technique "remonter l'arbre", manipulez l'événement Loaded Control, date à laquelle le contrôle a un parent et un arbre que vous pouvez marcher ...

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

    private void WindowsPhoneControl1_Loaded(Object sender, RoutedEventArgs e) 
    { 
     GetTheQueryString(); 
    } 
public WindowsPhoneControl1() 
    { 
     InitializeComponent(); 
     Loaded += WindowsPhoneControl1_Loaded; 
    } 

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

Je voudrais ajouter une propriété à la sous-classe UserControl qui serait définie par la page dans sa méthode OnNavigatedTo().