Silverlight - Как перейти от пользовательского элемента управления к обычной странице? - PullRequest
15 голосов
/ 16 сентября 2010

Если я делаю это внутри пользовательского элемента управления:

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

это говорит об этой ошибке:

Ссылка на объект требуется для нестатического поля, метода или свойства 'System.Windows.Navigation.NavigationService.Navigate (System.Uri)'

Спасибо


Что ж, я решил передать обычную страницу в качестве аргумента пользовательскому элементу управления, чтобы я мог получить NavigationService.

Ответы [ 8 ]

50 голосов
/ 09 февраля 2011
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri);
12 голосов
/ 08 января 2011

Я обычно использую EventHandler.Пример: в вашем пользовательском элементе управления определите что-то вроде

public event EventHandler goToThatPage;

, которое вы будете вызывать в вашем примере элемента управления, например:

goToThatPage(this, new EventArgs());

Затем в конструкторе вашего MainPage.xaml.cs (если там содержится пользовательский элемент управления) вы определите:

uxControlName.goToThatPage+= new EventHandler(ControlGoToThatPage);

и где-то в вашем файле MainPage.xaml.cs вы в конце концов объявите действие, которое нужно выполнить:

    void ControlGoToThatPage(object sender, EventArgs e)
    {
        this.NavigationService.Navigate(new Uri("/Pages/ThatPage.xaml", UriKind.Relative));
    }
2 голосов
/ 31 октября 2013

Вот еще одно решение для Silverlight для Windows Phone 8:

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));
1 голос
/ 17 сентября 2010

NavigationService - это свойство объекта страницы в Silverlight, поэтому вы получаете эту ошибку. Это не свойство UserControl в Silverlight.

Ниже приведены несколько вариантов, которые помогут решить возникшую проблему.

  1. Рассматривать пользовательский контроль как элемент управления. Дайте ему событие, которое будет срабатывать при нажатии кнопки. Страница может прослушивать это событие и обрабатывать навигацию при ее запуске.

  2. Вы можете разрешить вашей странице доступ к ее родителю или передать NavigationService со страницы в usercontrol.

  3. Вы также можете настроить это с помощью обмена сообщениями, но это будет более сложным. Многие MVVM-фреймворки имеют функции обмена сообщениями. MVVM Light имеет его.

1 голос
/ 17 сентября 2010

NavigationService - это класс. Navigate - это метод, который вы можете вызывать для экземпляров этого класса. Это не статический метод, который можно вызывать извне ссылки на объект.

В основном вам нужно получить текущий NavigationService для текущей страницы. Эта ссылка http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationservice.aspx должна помочь.

0 голосов
/ 29 июля 2013

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

Оказывается, мне нужно было вызвать обновление, а не навигацию;потому что я изначально думал, что навигация перезагрузит страницу, если URI совпадает с текущей страницей.Прости меня, новичка.

(((Application.Current.RootVisual as MainPage).ContentFrame as Frame).Content as Page).NavigationService.Refresh();
0 голосов
/ 10 декабря 2011
((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame"))
    .Navigate(new Uri("Page Name", UriKind.Relative));
0 голосов
/ 17 сентября 2010
        if(Application.Current.RootVisual is Page)
        {
            ((Page) (Application.Current.RootVisual)).NavigationService.Navigate(uri);
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...