用于在表单之间导航的路由 class

Routing class for navigation between forms

我是 C# 和面向对象编码的新手,因此我想知道如何创建路由 class 以便在 .Net Framework WPF 应用程序中的表单之间导航。

目前我正在这样的表单之间导航:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        new Classes.SessionService();
    }
    private void Customer_Page_click(object sender, RoutedEventArgs e)
    {
        CustomerPage CP = new CustomerPage();
        CP.Show();
        this.Close();
    }
    private void Staff_Menu_click(object sender, RoutedEventArgs e)
    {
        Forms.StaffPage SP = new Forms.StaffPage();
        SP.Show();
        this.Close();
    }

    private void Exit_click(object sender, RoutedEventArgs e)
    {
        this.Close();
    }
}

有人告诉我最好创建一个路由 class,因为它会更多地分隔代码,但我还没有找到在表单之间导航的示例,只能在网页之间导航。

我强烈建议您在开始创建自己的基础架构之前使用现有的库。 (我通过艰难的方式学会了它,并最终使用了 prism ;))还有其他很棒的图书馆。只需转到 youtube 并搜索 "c# prism outlook",那里有来自 brian lagunas 的非常好的棱镜教程。

编辑: 只是为了给你一个基本的想法,你可以如何自己解决这个问题:

主要Windowxaml:

<Window x:Class="WpfTestApp.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:WpfTestApp"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="100"/>
        <RowDefinition Height="*"/>
        <RowDefinition Height="auto"/>
    </Grid.RowDefinitions>
    <WrapPanel Grid.Row="0" x:Name="Ribbon"/>
    <ContentPresenter Grid.Row="1" x:Name="Content"/>
    <StackPanel Grid.Row="2">
        <Button Grid.Row="0" Content="SetContentFormA"  Click="Button_Click"/>
        <Button Grid.Row="0" Content="SetContentFormB"  Click="Button_Click_1"/>
        <Button Grid.Row="0" Content="AddNewFormAToRibbon"  Click="Button_Click_2"/>
        <Button Grid.Row="0" Content="RemoveFormBFromRibbon"  Click="Button_Click_3"/>
    </StackPanel>
</Grid>

MainWindow.cs:

 public partial class MainWindow : Window
{
    private FormB b;

    public MainWindow()
    {
        InitializeComponent();

        PageControler.Content = Content;
        PageControler.Ribbon = Ribbon;

        b = new FormB();

        Ribbon.Children.Add(b);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        PageControler.SetContent(new FormA());
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        PageControler.SetContent(new FormB());
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        PageControler.AddToRibbon(new FormA());
    }

    private void Button_Click_3(object sender, RoutedEventArgs e)
    {
        PageControler.RemoveFromRibbon(b);
    }
}

页面控制器:

public static class PageControler
{
    public static ContentPresenter Content { get; set; }
    public static WrapPanel Ribbon { get; set; }


    public static void SetContent(UserControl control)
    {
    Content.Content = control;
    }

    public static void AddToRibbon(UserControl control)
    {
        Ribbon.Children.Add(control);
    }

    public static void RemoveFromRibbon(UserControl control)
    {
        Ribbon.Children.Remove(control);
    }
}

FormA (& B):

<UserControl x:Class="WpfTestApp.FormA"
         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:WpfTestApp"
         mc:Ignorable="d" 
         d:DesignHeight="450" d:DesignWidth="800">
<Grid Background="Violet">
    <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Text="Form A"/>
</Grid>

你也可以