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

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

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

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

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

Спасибо


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

Ответы

Ответ 1

(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri);

Ответ 2

Обычно я использую 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));
    }

Ответ 3

Вот еще одно решение для 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));

Ответ 4

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

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

Ответ 5

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

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

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

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

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

Ответ 6

((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame"))
    .Navigate(new Uri("Page Name", UriKind.Relative));

Ответ 7

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

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

(((Application.Current.RootVisual as MainPage).ContentFrame as Frame).Content as Page).NavigationService.Refresh();

Ответ 8

        if(Application.Current.RootVisual is Page)
        {
            ((Page) (Application.Current.RootVisual)).NavigationService.Navigate(uri);
        }