Ответ 1
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri);
Если я делаю это внутри элемента управления пользователя:
NavigationService.Navigate(new Uri("/Alliance.xaml", UriKind.Relative));
он говорит об этой ошибке:
Ссылка на объект требуется для нестатического поля, метода или свойства "System.Windows.Navigation.NavigationService.Navigate(System.Uri)"
Спасибо
Ну, я решил передать обычную страницу в качестве аргумента для User Control, поэтому я мог получить NavigationService.
(Application.Current.RootVisual as PhoneApplicationFrame).Navigate(uri);
Обычно я использую 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));
}
Вот еще одно решение для 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));
NavigationService - это класс. Навигация - это метод, который вы можете вызвать в экземплярах этого класса. Это не статический метод, который вы можете вызвать извне ссылки на объект.
В основном вам нужно получить текущий NavigationService для текущей страницы. Эта ссылка http://msdn.microsoft.com/en-us/library/system.windows.navigation.navigationservice.aspx должна помочь.
NavigationService - это свойство объекта страницы в Silverlight, поэтому вы получаете эту ошибку. Это не свойство UserControl в Silverlight.
Ниже перечислены несколько параметров, которые позволят решить проблему, которую вы видите.
Рассматривайте usercontrol как элемент управления. Дайте ему событие, которое оно будет срабатывать при нажатии кнопки. Страница может прослушивать это событие и обрабатывать навигацию, когда она срабатывает.
Вы можете либо разрешить доступ к вашей странице своему родительскому объекту, либо передать навигационную службу со страницы на пользовательский контроль.
Вы также можете настроить это с помощью обмена сообщениями, но это будет более сложно. Многие структуры MVVM имеют функции обмена сообщениями. MVVM Light имеет его.
((Frame)(Application.Current.RootVisual as MainPage).FindName("ContentFrame"))
.Navigate(new Uri("Page Name", UriKind.Relative));
Я знаю, что это устарело, но я тоже был в той же ситуации в приложении Silverlight. Я хотел сделать что-то похожее на ответ Дипака, но я не мог понять это в течение самого долгого времени, почему это не сработало в моем случае.
Оказывается, мне нужно было вызвать обновление, а не навигацию; потому что я изначально думал, что navigate будет перезагружать страницу, если URI совпадает с текущей страницей. Простите мой новичок.
(((Application.Current.RootVisual as MainPage).ContentFrame as Frame).Content as Page).NavigationService.Refresh();
if(Application.Current.RootVisual is Page)
{
((Page) (Application.Current.RootVisual)).NavigationService.Navigate(uri);
}