WPF — Не может использовать этот.NavigationService.Перейдите на страницу, которая находится в окне

#c# #wpf

Вопрос:

Я загрузил страницу 1 в рамку в окне, и внутри страницы 1 есть кнопка с этим кодом:

 private void Button_Click_2(object sender, RoutedEventArgs e)  {  this.NavigationService.Navigate(new Uri("NextPage.xaml", UriKind.Relative));  }  

Это кадр в главном окне:

 lt;Gridgt;  lt;Frame x:Name="Main" NavigationUIVisibility="Hidden" Margin="0 0 0 0" /gt; lt;/Gridgt;  

Вот где я загружаю страницу 1:

 private void Window_Loaded(object sender, RoutedEventArgs e)  {  Main.Navigate(new Page1());  }  

Это работает, когда я удаляю окно и напрямую запускаю приложение со страницы 1, но я хочу иметь окно, потому что то, которое автоматически создает Visual Studio, выглядит очень плохо. Это вызывает обычное System.NullReferenceException: 'Object reference not set to an instance of an object.' исключение, когда я пытаюсь использовать его внутри страницы, загруженной в фрейм главного окна.

Итак, как я могу перемещаться между страницами в окне?

Ответ №1:

Вы можете использовать Window.GetWindow это, чтобы получить ссылку на родительское окно, привести результат к вашему типу окна, а затем получить доступ к Frame :

 private void Button_Click_2(object sender, RoutedEventArgs e) {  MainWindow parentWindow = Window.GetWindow(this) as MainWindow;  if (parentWindow != null)  parentWindow.Main.NavigationService.Navigate(new Uri("NextPage.xaml", UriKind.Relative)); }  

Комментарии:

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

2. Как он может загрузить страницу, если вы ее не видите…?

3. Я видел, как код переходит к InitializeComponent() функции NextPage во время отладки.

4. Значит, у вас есть более одного Frame под названием «Главный»? Или вы отображаете более одного окна? Или переход обратно Page1 после того, как вы перешли к NextPage ? Вам необходимо предоставить воспроизводимый пример, если вам нужна дополнительная помощь. Вы, очевидно, что-то упускаете здесь, потому что решение, которое я показал, простое.

5. NVM понял это. Спасибо вам за вашу помощь. Сейчас это работает идеально.