Рабочий стол WinUI 3.0 - Навигация по странице C #

Я пытаюсь выполнить простую навигацию по страницам, но не могу найти никакой документации о том, как это сделать в WinUI 3.0.

В настоящее время, когда я создаю пустое приложение с помощью WinUI 3.0, я получаю следующий код, созданный в App.xaml.cs

    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        m_window = new MainWindow();
        m_window.Activate();
    }

    private Window m_window;

Хотя во многих других примерах, которые я нашел в Интернете, корневой фрейм определен в событии OnLaunched выше.

Как мне определить MainWindow.xaml или App.xaml так, чтобы я мог получить фрейм, в котором я могу свободно переключаться между Page1.xaml и Page2.xaml?

Изменить: теперь я обнаружил, что могу получить кадр, вызвав:

    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        m_window = new MainWindow();
        Frame rootFrame = m_window.Content as Frame;
        m_window.Activate();
        rootFrame.Navigate(typeof(UI.MainMenu));
    }

Но Navigate не работает с System.NullReferenceException: 'Object reference not set to an instance of an object.' ошибкой. Что я делаю не так: S?


person Tikki    schedule 17.06.2021    source источник
comment
вы можете опубликовать трассировку стека для исключения?   -  person keuleJ    schedule 17.06.2021
comment
System.NullReferenceException HResult = 0x80004003 Сообщение = Ссылка на объект не установлена ​​на экземпляр объекта. Источник = StackOverflow StackTrace: в StackOverflow.App.OnLaunched (аргументы LaunchActivatedEventArgs) в S: \ dev \ StackOverflow \ StackOverflow \ StackOverflow \ App.xaml.cs: строка 48   -  person Tikki    schedule 18.06.2021


Ответы (1)


Итак, мне удалось найти способ сделать это.

Сначала я создал окно, которое буду называть NavigationRootWindow.

<Window
x:Class="StackOverflow.UI.NavigationRootWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:StackOverflow.UI"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid>
    <Frame x:Name="rootFrame"/>
</Grid>

Здесь я добавил фрейм, который назвал rootFrame.

Теперь в приложении я определяю функцию onLaunched как автоматически сгенерированную, но я удостоверяюсь, что добавленное окно является корневым окном:

    protected override void OnLaunched(Microsoft.UI.Xaml.LaunchActivatedEventArgs args)
    {
        m_window = new UI.NavigationRootWindow();
        m_window.Activate();
    }

    private Window m_window;

Теперь в файле cs окна NavigationRootWindow я могу перейти к нужному файлу страницы:

public sealed partial class NavigationRootWindow : Window
{
    public NavigationRootWindow()
    {
        this.InitializeComponent();

        rootFrame.Navigate(typeof(MainMenu));
    }
}

Где MainMenu - это элемент страницы :) Теперь в элементе страницы вы можете просто вызвать this.Frame, чтобы получить текущий фрейм, что позволяет вам переходить на другую страницу и даже вперед и назад. Пример:

    private void ConnectButton_OnClick(object sender, RoutedEventArgs e)
    {
        this.Frame.Navigate(typeof(SecondMenu));
    }

Я не уверен, что это лучшая практика, но она действительно работает: D

person Tikki    schedule 21.06.2021