Как получить доступ к QueryString в Windows Phone 7 из пользовательского элемента управления - PullRequest
3 голосов
/ 17 августа 2010

У меня есть простой пользовательский элемент управления в Windows Phone 7, и я хочу получить доступ к коллекции строк запросов из пользовательских элементов управления Constructor. Я перепробовал много способов и, похоже, не могу получить доступ к содержащейся в XAML коллекции строк запросов.

По сути, я перехожу на страницу, и мой пользовательский элемент управления собирается получить доступ к значению строки запроса, чтобы записать значение обратно в интерфейс.

Не хватает добавления сборки или ссылки или чего-то еще?

Ответы [ 3 ]

7 голосов
/ 17 августа 2010

Я не уверен, что вы должны пытаться получить информацию от конструктора страницы, поскольку она не обязательно будет вызываться каждый раз, когда вы заходите на эту страницу. Лучшим подходом является переопределение метода OnNavigatedTo, унаследованного от PhoneApplicationPage. Посмотрев немного более внимательно на свой вопрос, вы можете попытаться сделать это с помощью элемента управления, встроенного в страницу, и в этом случае вам нужно перейти на страницу, чтобы получить навигационную информацию.

В любом случае, свойство 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 голосов
/ 22 августа 2010

Я бы добавил к подклассу UserControl свойство, которое будет установлено страницей в методе OnNavigatedTo ().

0 голосов
/ 19 августа 2010

Извините за это - я начал туда добираться, и спасибо за разъяснения. Тогда вам лучше всего пройтись вверх по визуальному дереву от вашего элемента управления, чтобы найти страницу, которую вы можете получить на NavigationContext. В моем примере ниже у меня есть кнопка на пользовательском элементе управления на странице, событие щелчка которой находит контекст навигации и ищет определенный параметр навигации - я не мог сказать из вопроса или вашего продолжения, что будет управлять элементом управления чтобы «хотеть» найти содержимое строки запроса.

(Примечание о получении информации из ctor следует приведенному ниже коду)

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

Обратите внимание, что это не будет работать с ctor из-за того, как работает Xaml ... тег Xml управляет вызываемым ctor, затем свойства устанавливаются как указано, затем он добавляется как дочерний элемент / item / etc его контейнер. Если вам все же нужно добраться до контекста как можно скорее, используя эту технику «ходьбы по дереву», обработайте событие Loaded элемента управления, к которому элементу управления будут предоставлен родитель и дерево, по которому можно пройти ...

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

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