Класс маршрутизации для навигации между формами - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок в C# и объектно-ориентированном кодировании, поэтому мне было интересно, как создать класс маршрутизации для навигации между формами в. 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();
    }
}

Мне сказали, что лучше создать класс маршрутизации, так как он будет больше разделять код, но я не смог найти пример для навигации между формами, но только между веб-страницами.

1 Ответ

0 голосов
/ 07 апреля 2020

Я настоятельно рекомендую вам использовать существующую библиотеку, начиная создавать собственную инфраструктуру. (Я усвоил это нелегко и в итоге использовал призму;)) Есть и другие замечательные библиотеки. Просто go на YouTube и найдите «c# prism outlook», есть довольно хорошее руководство по призме от Брайана Лагуны.

Редактировать: Просто чтобы дать вам основную c идею, как вы можете решить это самостоятельно:

Главное окно xaml:

<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);
    }
}

PageControler:

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>

Вы можете

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