在C# WPF中实现登录页面跳转的两种方案

 更新时间:2025年10月22日 10:13:46   作者:张謹礧  
在 C# WPF 中实现登录页面跳转,核心是 “验证登录逻辑” 与 “页面切换” 结合,常用两种方案:NavigationWindow 导航跳转(适合多页面场景)和Window+UserControl 切换(适合单窗口集成场景),本文介绍了具体实现步骤,需要的朋友可以参考下

引言

在 C# WPF 中实现登录页面跳转,核心是 “验证登录逻辑” 与 “页面切换” 结合,常用两种方案:NavigationWindow 导航跳转(适合多页面场景)和Window+UserControl 切换(适合单窗口集成场景)。以下是具体实现步骤:

一、基础准备:创建登录页面结构

无论哪种方案,先创建登录页面(包含账号、密码输入框和登录按钮),这里以通用 XAML 结构为例:

登录页面核心 XAML(LoginPage.xaml/ LoginUC.xaml)

<!-- 以Page为例,UserControl结构完全一致,仅根标签改为<UserControl> -->
<Page x:Class="WpfLoginDemo.LoginPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="登录页面">
    <!-- 用Grid布局登录表单,居中显示 -->
    <Grid Background="#F5F5F5">
        <Grid Width="300" Height="250" Background="White" Margin="0,0,0,100" HorizontalAlignment="Center" VerticalAlignment="Center">
            <Grid.RowDefinitions>
                <RowDefinition Height="40"/>
                <RowDefinition Height="50"/>
                <RowDefinition Height="50"/>
                <RowDefinition Height="60"/>
            </Grid.RowDefinitions>
​
            <!-- 标题 -->
            <TextBlock Grid.Row="0" Text="用户登录" FontSize="18" HorizontalAlignment="Center" VerticalAlignment="Center" FontWeight="Bold"/>
            
            <!-- 账号输入框 -->
            <StackPanel Grid.Row="1" Orientation="Horizontal" Margin="20,0">
                <TextBlock Text="账号:" Width="60" VerticalAlignment="Center"/>
                <TextBox x:Name="TxtAccount" Width="180" Height="30" Margin="5,0" Padding="5"/>
            </StackPanel>
            
            <!-- 密码输入框 -->
            <StackPanel Grid.Row="2" Orientation="Horizontal" Margin="20,0">
                <TextBlock Text="密码:" Width="60" VerticalAlignment="Center"/>
                <PasswordBox x:Name="TxtPwd" Width="180" Height="30" Margin="5,0" Padding="5"/>
            </StackPanel>
            
            <!-- 登录按钮 -->
            <Button Grid.Row="3" Content="登录" Width="100" Height="35" Margin="0,10" 
                    Background="#4A86E8" Foreground="White" Click="BtnLogin_Click"/>
        </Grid>
    </Grid>
</Page>

二、方案 1:NavigationWindow 导航跳转(多页面场景)

适合需要独立登录页、且登录后跳转到其他 Page(如首页)的场景,自带导航历史(但登录页通常无需后退,可隐藏导航栏)。

步骤 1:设置启动窗口为 NavigationWindow

修改App.xaml,指定启动窗口为NavigationWindow,并默认加载登录页:

<Application x:Class="WpfLoginDemo.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             StartupUri="MainNavWindow.xaml"> <!-- 启动导航窗口 -->
</Application>

步骤 2:创建 NavigationWindow 并隐藏导航栏

新建MainNavWindow.xaml,隐藏默认导航栏(避免登录后可返回登录页):

<NavigationWindow x:Class="WpfLoginDemo.MainNavWindow"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  Title="WPF登录示例" Width="800" Height="600"
                  Source="LoginPage.xaml"  <!-- 初始加载登录页 -->
                  ShowsNavigationUI="False"> <!-- 隐藏导航栏(关键) -->
</NavigationWindow>

步骤 3:实现登录验证与跳转逻辑

LoginPage.xaml.cs中,添加登录按钮点击事件,验证账号密码后跳转到首页(HomePage):

using System.Windows;
using System.Windows.Controls;
​
namespace WpfLoginDemo
{
    public partial class LoginPage : Page
    {
        public LoginPage()
        {
            InitializeComponent();
        }
​
        private void BtnLogin_Click(object sender, RoutedEventArgs e)
        {
            // 1. 获取输入的账号和密码(PasswordBox需用Password属性,而非Text)
            string account = TxtAccount.Text.Trim();
            string pwd = TxtPwd.Password.Trim();
​
            // 2. 简单登录验证(实际项目需对接数据库/接口,此处用固定值演示)
            if (string.IsNullOrEmpty(account) || string.IsNullOrEmpty(pwd))
            {
                MessageBox.Show("账号或密码不能为空!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            if (account == "admin" && pwd == "123456") // 模拟正确账号密码
            {
                // 3. 验证通过,跳转到首页(HomePage需提前创建)
                this.NavigationService.Navigate(new HomePage());
            }
            else
            {
                MessageBox.Show("账号或密码错误!", "提示", MessageBoxButton.OK, MessageBoxImage.Error);
                // 清空密码框
                TxtPwd.Password = "";
            }
        }
    }
}

步骤 4:创建首页(HomePage.xaml)

登录后跳转的目标页面,示例如下:

<Page x:Class="WpfLoginDemo.HomePage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="首页">
    <Grid>
        <TextBlock Text="登录成功!欢迎进入首页" FontSize="24" HorizontalAlignment="Center" VerticalAlignment="Center"/>
        <!-- 可添加退出登录按钮,跳回登录页:this.NavigationService.Navigate(new LoginPage()); -->
    </Grid>
</Page>

三、方案 2:Window+UserControl 切换(单窗口场景)

适合登录页与首页集成在同一个 Window 中,通过切换 UserControl 实现 “跳转”,界面更紧凑(无独立窗口切换感)。

步骤 1:创建登录和首页的 UserControl

  • 登录 UserControl:LoginUC.xaml(XAML 结构同方案 1 的 LoginPage,仅根标签改为<UserControl>
  • 首页 UserControl:HomeUC.xaml(XAML 结构同方案 1 的 HomePage,仅根标签改为<UserControl>

步骤 2:创建主 Window(承载 UserControl)

新建MainWindow.xaml,用一个 Grid(ContentContainer)作为 UserControl 的容器,默认加载登录 UC:

<Window x:Class="WpfLoginDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfLoginDemo" <!-- 引用本地命名空间 -->
        Title="WPF登录示例" Width="800" Height="600" WindowStartupLocation="CenterScreen">
    <Grid>
        <!-- UserControl容器:默认加载登录UC -->
        <Grid x:Name="ContentContainer">
            <local:LoginUC/>
        </Grid>
    </Grid>
</Window>

步骤 3:通过事件传递实现跳转(关键)

由于 UserControl 无法直接操作 Window 的容器,需通过事件委托将登录成功的信号传递给 MainWindow,再由 MainWindow 切换 UC:

在 LoginUC.xaml.cs 中定义登录成功事件

using System;
using System.Windows;
using System.Windows.Controls;
​
namespace WpfLoginDemo
{
    public partial class LoginUC : UserControl
    {
        // 定义登录成功事件(供MainWindow订阅)
        public event Action OnLoginSuccess;
​
        public LoginUC()
        {
            InitializeComponent();
        }
​
        private void BtnLogin_Click(object sender, RoutedEventArgs e)
        {
            // 1. 登录验证逻辑(同方案1)
            string account = TxtAccount.Text.Trim();
            string pwd = TxtPwd.Password.Trim();
​
            if (string.IsNullOrEmpty(account) || string.IsNullOrEmpty(pwd))
            {
                MessageBox.Show("账号或密码不能为空!", "提示", MessageBoxButton.OK, MessageBoxImage.Warning);
                return;
            }
            if (account == "admin" && pwd == "123456")
            {
                // 2. 验证通过,触发登录成功事件
                OnLoginSuccess?.Invoke();
            }
            else
            {
                MessageBox.Show("账号或密码错误!", "提示", MessageBoxButton.OK, MessageBoxImage.Error);
                TxtPwd.Password = "";
            }
        }
    }
}

在 MainWindow.xaml.cs 中订阅事件并切换 UC

using System.Windows;
​
namespace WpfLoginDemo
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
​
            // 1. 获取当前加载的LoginUC
            if (ContentContainer.Children[0] is LoginUC loginUC)
            {
                // 2. 订阅登录成功事件
                loginUC.OnLoginSuccess += () =>
                {
                    // 3. 事件触发:清空容器,加载首页UC
                    ContentContainer.Children.Clear();
                    ContentContainer.Children.Add(new HomeUC());
                };
            }
        }
    }
}

四、两种方案对比与优化建议

方案优点缺点适用场景
NavigationWindow+Page实现简单,无需事件传递窗口切换有 “闪动感”,导航栏需隐藏多独立页面(如带注册页、忘记密码页)
Window+UserControl单窗口集成,界面更流畅需通过事件传递信号,略复杂紧凑的单窗口应用(如管理系统)

优化建议:

  • 密码安全:实际项目中,密码不能明文验证,需用 MD5/SHA256 加密后与数据库存储的加密值对比。
  • 登录状态保存:登录成功后,可通过Application.Current.Properties存储用户信息(如Application.Current.Properties["UserName"] = account;),供后续页面使用。
  • 退出登录:首页可添加 “退出登录” 按钮,点击后跳回登录页(方案 1 用NavigationService.Navigate(new LoginPage()),方案 2 切换回LoginUC)。

以上就是在C# WPF中实现登录页面跳转的两种方案的详细内容,更多关于C# WPF登录页面跳转的资料请关注脚本之家其它相关文章!

相关文章

  • WPF中图像处理的方法介绍

    WPF中图像处理的方法介绍

    这篇文章介绍了WPF中图像处理的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-06-06
  • C#表达式树Expression动态创建表达式

    C#表达式树Expression动态创建表达式

    这篇文章介绍了C#表达式树Expression动态创建表达式的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • C#开发webService接口的流程步骤

    C#开发webService接口的流程步骤

    在C#中,Web Service 接口是一种用于远程程序间的通信机制,它允许客户端通过HTTP协议访问服务器端提供的功能和服务,本文给大家详细介绍了C#开发webService接口的流程步骤,需要的朋友可以参考下
    2024-11-11
  • C#中使用Lambda表达式自定义比较器实现两个列表合并实例

    C#中使用Lambda表达式自定义比较器实现两个列表合并实例

    这篇文章主要介绍了C#中使用Lambda表达式自定义比较器实现两个列表的合并实例,本文给出示例代码和运行效果,需要的朋友可以参考下
    2014-10-10
  • Winform界面中实现通用工具栏按钮的事件处理方法

    Winform界面中实现通用工具栏按钮的事件处理方法

    下面小编就为大家分享一篇Winform界面中实现通用工具栏按钮的事件处理方法,具有很好的参考价值,希望对大家有所帮助
    2017-11-11
  • C#实现多文件打包压缩(.Net Core)

    C#实现多文件打包压缩(.Net Core)

    本文详细讲解了.Net Core框架下C#实现多文件打包压缩的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • C#实现语音视频录制-附demo源码

    C#实现语音视频录制-附demo源码

    在很多语言视频软件系统中,经常有将实时的音频或者是视频录制为文件保存到磁盘空间的需求,本篇给大家讲C#实现语音视频录制-附demo源码,感兴趣的朋友一起来学习吧
    2015-08-08
  • C#创建及访问网络硬盘的实现

    C#创建及访问网络硬盘的实现

    本文主要介绍了C#创建及访问网络硬盘的实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C#中datatable序列化与反序列化实例分析

    C#中datatable序列化与反序列化实例分析

    这篇文章主要介绍了C#中datatable序列化与反序列化,是datatable的常用技巧,需要的朋友可以参考下
    2014-09-09
  • C# WPF自制简单的批注工具

    C# WPF自制简单的批注工具

    在教学和演示中,我们通常需要对重点进行批注,下载安装第三方工具批注显得很麻烦,本文将使用WPF开发了一个批注工具,感兴趣的可以了解下
    2024-11-11

最新评论