如何在不使用 mvvm 的情况下使 UserControl 中的主页按钮切换 MainWindow 框架中的页面?

匿名
2024-04-01T06:35:38.9533333+00:00

嘿,你好! 我是 wpf 和 c# 的新手。 我现在已经花了 2 天的时间在网上搜索,没有任何解决方案可以以令人满意的方式实施。要么我无法使解决方案起作用,要么是烦人的 MVVM 模式。在我目前的学习步骤中,它太抽象了。 因此,我创建了一个新应用程序,其中包含制作所需功能所需的最简单元素。 它是一个 WPF 应用/.Net 4.8 框架。 带有 Frame 和 UserControl 的 MainWindow。 3 页: 带有 2 个按钮的 LoginPage,可以在 MainWindow 的框架中打开其他 2 个页面: LoginSubPage1 LoginSubPage2 和 UserControl “BottomBar” 包含 3 个按钮: 返回 首页 出口

MainWindow.xaml:

<Window x:Class="UserControl2020_12_15.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:uc="clr-namespace:UserControl2020_12_15"
        mc:Ignorable="d"
        Title="MainWindow" Height="400" Width="600" WindowStartupLocation="CenterScreen"
        Background="CadetBlue">
    <Grid>
        <Frame x:Name="PageFrame" NavigationUIVisibility="Hidden"
               VerticalAlignment="Top" Height="250"/>
        <uc:BottomBar VerticalAlignment="Bottom" Height="80"/>
    </Grid>
</Window>

Loginpage.xaml:

<Page x:Class="UserControl2020_12_15.LoginPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d">
    <StackPanel>
        <Button Content="LoginSubPage1" Click="OneClick" Background="Red"/>
        <Button Content="LoginSubPage2" Click="TwoClick" Background="Green"/>
    </StackPanel>
</Page>

Loginsubpage1.Xaml:

<Page x:Class="UserControl2020_12_15.LoginSubPage1"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d" Background="Red">
</Page>

Loginsubpage2.Xaml:

<Page x:Class="UserControl2020_12_15.LoginSubPage2"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      mc:Ignorable="d" Background="Green">
</Page>

Bottomber.Samel:

<UserControl x:Class="UserControl2020_12_15.BottomBar"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d" 
             d:DesignHeight="80" d:DesignWidth="800">
    <Grid>
        <Button Content="BackBtn" HorizontalAlignment="Left" Margin="20,0,0,0"
                Click="BackClick" Height="50"/>
        <Button Content="HomeBtn" HorizontalAlignment="Center" Margin="0"
                Click="HomeClick" Height="50"/>
        <Button Content="ExitBtn" HorizontalAlignment="Right" Margin="0,0,20,0"
                Click="ExitClick" Height="50"/>
    </Grid>
</UserControl>

MainWindow.xaml.cs:

using System.Windows;

namespace UserControl2020_12_15
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            LoginPage loginPage = new LoginPage();
            PageFrame.NavigationService.Navigate(loginPage);
        }
    }
}

Lokinbage.Semal.CS:

using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace UserControl2020_12_15
{
    public partial class LoginPage : Page
    {
        public LoginPage()
        {
            InitializeComponent();
        }

        private void OneClick(object sender, RoutedEventArgs e)
        {
            NavigationService nav = NavigationService.GetNavigationService(this);
            nav.Navigate(new Uri("LoginSubPage1.xaml", UriKind.RelativeOrAbsolute));
        }

        private void TwoClick(object sender, RoutedEventArgs e)
        {
            NavigationService nav = NavigationService.GetNavigationService(this);
            nav.Navigate(new Uri("LoginSubPage2.xaml", UriKind.RelativeOrAbsolute));
        }
    }
}

Bottomer.Semal.CS:

using System.Windows;
using System.Windows.Controls;

namespace UserControl2020_12_15
{
    public partial class BottomBar : UserControl
    {
        public BottomBar()
        {
            InitializeComponent();
        }

        private void BackClick(object sender, RoutedEventArgs e)
        {

        }

        private void HomeClick(object sender, RoutedEventArgs e)
        {

        }

        private void ExitClick(object sender, RoutedEventArgs e)
        {
            Application.Current.Shutdown();
        }
    }
}

HomeClick 应该在 Frame 中打开 LoginPage.xaml,或者重新加载应用程序,以便它回到框架包含 LoginPage.xaml 的位置,无论我们在应用程序中的哪个位置 ,BackClick 都应该返回到上次查看的页面

我不想在 MVVM 构建中制作它,而只是在 BottomBar 后面的代码中制作它。

Note:此问题总结整理于:How to make a Home-button in UserControl switch a page in MainWindow frame without using mvvm?

开发人员技术 | Windows Presentation Foundation
开发人员技术 | C#
开发人员技术 | C#

一种面向对象的类型安全的编程语言,它起源于 C 语言系列,包括对面向组件的编程的支持。

0 个注释 无注释

问题作者接受的答案

Hui Liu-MSFT 48,711 信誉分 Microsoft 外部员工
2024-04-01T08:27:22.64+00:00

我通过在不使用 MVVM 的情况下为您的项目更新两个部分来实现您想要的内容:

第 1 部分:在 MainWindow.xaml 中添加框架,我更新了 MainWindow.xaml,如下所示:x:FieldModifier="public"

 <Grid>  
        <Frame Name="PageFrame" NavigationUIVisibility="Hidden" VerticalAlignment="Top" Height="250" x:FieldModifier="public" />  
        <uc:BottomBar VerticalAlignment="Bottom" Height="80"/>  
    </Grid>  

**第 2 部分:**将您的BottomBar.cs替换为以下代码:

public partial class BottomBar : UserControl  
    {  
        public BottomBar()  
        {  
            InitializeComponent();  
        }  
  
        Frame frame = (Application.Current.MainWindow as MainWindow).PageFrame;  
  
        private void BackClick(object sender, RoutedEventArgs e)  
        {  
            if(frame.CanGoBack)  
            {  
                frame.GoBack();  
            }  
        }  
  
        private void HomeClick(object sender, RoutedEventArgs e)  
        {  
            frame.Navigate(new Uri("LoginPage.xaml", UriKind.RelativeOrAbsolute));  
        }  
  
        private void ExitClick(object sender, RoutedEventArgs e)  
        {  
            Application.Current.Shutdown();  
        }  
    }  

如果回复有帮助,请点击“接受答案”并点赞。

注意:如果您想接收此线程的相关电子邮件通知,请按照我们文档中的步骤启用电子邮件通知。

此答案是否有帮助?

1 个人认为此答案很有帮助。
0 个注释 无注释

0 个其他答案

排序依据: 非常有帮助

你的答案

提问者可以将答案标记为“已接受”,审查方可以将答案标记为“已推荐”,这有助于用户了解答案是否解决了提问者的问题。