如何从用户控件中访问 Windows Phone 7 的 QueryString

3
我有一个简单的Windows Phone 7用户控件,我想在用户控件的构造函数中访问查询字符串集合。我尝试过很多方法,但似乎无法访问包含XAML的查询字符串集合。
本质上,我正在导航到页面,并且我的用户控件将访问查询字符串值以将该值写回界面。
我是否忘记添加程序集或引用或其他内容?
3个回答

7

我不确定您是否应该尝试从页面构造函数中获取信息,因为它不一定每次着陆在此页面上都会被调用。更好的方法是覆盖从PhoneApplicationPage继承的OnNavigatedTo方法。仔细看一下您的问题,您可能正在尝试在嵌入页面的控件内执行此操作,在这种情况下,您需要获取页面以获取导航信息。

无论如何,页面的NavigationContext属性具有QueryString参数,您可以使用它来访问所需的信息。

以下示例假设在导航到此页面时,查询字符串中有一个名为"Message"的参数:

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

我认为这不会起作用,因为我在一个UserControl中,而不是你在类定义头中所引用的PhoneApplicationPage。这就是问题所在。一旦进入UserControl,我似乎无法访问NavigationContent上的任何内容。在Page/XAML级别上没有问题,在UserControl中却什么都没有。 - ryan maas

0
抱歉,我开始明白了,也感谢你的澄清。你最好的选择是从你的控件向上遍历视觉树,找到页面,然后就可以获取 NavigationContext 了。在我下面的示例中,我有一个按钮位于页面内的自定义控件上,点击事件会找到导航上下文并查找特定的导航参数 - 我无法从问题或者你的跟进中确定是什么驱使该控件 "想要" 获取查询字符串的内容。
(关于从构造函数获取信息的注意事项,请看代码下面的说明)
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标记驱动构造函数被调用,然后根据指示设置属性,然后将其添加为父项/子项等到其容器中。如果您确实需要使用此“向上遍历树”技术尽快获取上下文,请处理Control的Loaded事件,此时控件已经具有父级和可以遍历的树...
    public WindowsPhoneControl1()
    {
        InitializeComponent();
        Loaded += WindowsPhoneControl1_Loaded;
    }

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

0
我会给UserControl子类添加一个属性,该属性将在页面的OnNavigatedTo()方法中设置。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接