Страницы WPF с навигацией по странице с использованием шаблона MVVM - PullRequest
0 голосов
/ 11 октября 2019

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

Я нашел ЭТОТ пример, но проблема здесь в том, что навигация встроена в дополнительный элемент управления контентом. Это хорошо, если вы хотите иметь дополнительную панель навигации, но если ваше приложение должно выглядеть немного больше как приложение мастера (см. Рисунок ниже), то вам нужно привязать навигацию на каждой странице, например, кнопку назад навнизу слева и кнопка перемотки на следующую страницу справа внизу.

Wizard Application

Дело в том, что я не понимаю, как я могу подключитьICommand для определенной кнопки на странице, которая сообщает мэйнфрейму, какую страницу следует загружать при нажатии.

Как мне заархивировать эту механику при использовании шаблонов MVVM? Что мне нужно изменить в программе (см. Ссылку выше), чтобы это произошло?

Большое спасибо. С наилучшими пожеланиями, SKiD.

EDIT1:

Хорошо, позвольте мне показать вам конкретный пример только с двумя страницами. У меня есть MainWindow:

MainWindow XAML:

<Window x:Class="TestWPF.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TestWPF"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="300">
    <Grid>
        <Frame x:Name="mainFrame" Margin="5" />
    </Grid>
</Window>

Здесь больше ничего нет, только mainFrame, который загружает первую страницу в MainWindow.xaml.cs:

MainWindow.xaml.cs :

    public MainWindow()
    {
        InitializeComponent();
        mainFrame.Navigate(new Page1());
    }

У меня есть еще две страницы, которые имеют почти одинаковую структуру (для этого примера), но будут отличаться в реальномприменение. Я должен упомянуть здесь, что навигация осуществляется по страницам, а не как дополнительный фрейм внутри главного окна:

Page01 :

<Page x:Class="TestWPF.Page1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:TestWPF"
    mc:Ignorable="d" 
    d:DesignHeight="450" d:DesignWidth="800"
    Title="Page1">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="*" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>

        <TextBlock Text="Page 01" Grid.Row="0" />

        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="75" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="75" />
            </Grid.ColumnDefinitions>

            <Button Grid.Column="2" Content="ToPage02" />
        </Grid>
    </Grid>
</Page>

Стр02 :

<Page x:Class="TestWPF.Page2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:local="clr-namespace:TestWPF"
    mc:Ignorable="d" 
    d:DesignHeight="450" d:DesignWidth="800"
    Title="Page2">

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="50" />
            <RowDefinition Height="*" />
            <RowDefinition Height="30" />
        </Grid.RowDefinitions>

        <TextBlock Text="Page 02" Grid.Row="0" />

        <Grid Grid.Row="2">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="75" />
                <ColumnDefinition Width="*" />
                <ColumnDefinition Width="75" />
            </Grid.ColumnDefinitions>

            <Button Grid.Column="0" Content="ToPage01" />
        </Grid>
    </Grid>
</Page>

Как видите, кнопки возврата к последней странице находятся на страницах. Только первая страница будет создана на главной странице и загружена. Теперь вопрос, если вы представляете, что позади есть конструкция MVVM (например, ViewModel и Model для каждой стороны), как это там подходит, если я должен использовать команды для вызова следующей страницы, как упомянуто в связанном учебном руководстве выше?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...