记录 | WPF基础学习登录界面制作

目录

  • 前言
  • 一、普通方式
    • Step1 创建项目
    • Step2 设计布局
    • Step3 对剩余布局进行内容填充
      • 可执行代码下载
    • Step4 编写点击事件
    • Step5 创建新WPF窗口
    • Step6 简单写点Index内容
    • Step7 跳转到Index
    • 当前代码下载
  • 二、绑定方式
    • 绑定用户名【单向绑定】
    • 双向绑定
    • 代码提供
  • 三、MVVM
    • 方式1: 拆出模型
      • 代码下载
    • 方式2 View Model
      • LoginViewModel类
      • LoginModel类
      • MainWindow类
      • mainWindow.axml
      • 代码下载
  • 更新时间


前言

参考文章:
参考视频:【WPF入门教程 Visual Studio 2022】WPF界面开发入门

自己的感想
演示登录界面和界面跳转功能。


一、普通方式

Step1 创建项目

Step2 设计布局

先分行,在对每行进行单独配置和划分。

  • 先分三行。
  • 再对第3行进行详细分割为4行2列
    如下图所示,红色为整体布局。
    在这里插入图片描述
    <Grid><!--整体划分3--><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition Height="auto"/><RowDefinition/></Grid.RowDefinitions><!--整体的第1行第1--><TextBlock Grid.Row="0" Grid.Column="0" Text="马鞍山市 图书馆" FontSize="18" HorizontalAlignment="Center" Margin="5"/><!--整体的第2行第1--><StackPanel Grid.Row="1" Grid.Column="0" Background="Blue"><TextBlock Text="登录" FontSize="22" HorizontalAlignment="Center" Foreground="White"/></StackPanel><!--整体第3行第1--><Grid Grid.Row="2" Grid.Column="0" ShowGridLines="True"><!--划分出43列布局--><Grid.RowDefinitions><RowDefinition Height="30"/><RowDefinition Height="30"/><RowDefinition Height="30"/><RowDefinition Height="30"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="auto"/><ColumnDefinition Width="200"/></Grid.ColumnDefinitions><!--其中第1行第1--><TextBlock Text="用户名" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"/><TextBox Grid.Row="0" Grid.Column="1"/></Grid></Grid>

Step3 对剩余布局进行内容填充

在这里插入图片描述

<Window x:Class="WPF_LoginUI.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:WPF_LoginUI"mc:Ignorable="d"Title="MainWindow" Height="450" Width="800"><Grid><!--整体划分3--><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition Height="auto"/><RowDefinition/></Grid.RowDefinitions><!--整体的第1行第1--><TextBlock Grid.Row="0" Grid.Column="0" Text="马鞍山市 图书馆" FontSize="18" HorizontalAlignment="Center" Margin="5"/><!--整体的第2行第1--><StackPanel Grid.Row="1" Grid.Column="0" Background="Blue"><TextBlock Text="登录" FontSize="22" HorizontalAlignment="Center" Foreground="White"/></StackPanel><!--整体第3行第1--><Grid Grid.Row="2" Grid.Column="0" HorizontalAlignment="Center" VerticalAlignment="Center"><!--划分出43列布局--><Grid.RowDefinitions><RowDefinition Height="30"/><RowDefinition Height="30"/><RowDefinition Height="30"/><RowDefinition Height="30"/></Grid.RowDefinitions><Grid.ColumnDefinitions><ColumnDefinition Width="auto"/><ColumnDefinition Width="200"/></Grid.ColumnDefinitions><!--其中第1行第1--><TextBlock Text="用户名" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"/><!--其中第1行第2--><TextBox Grid.Row="0" Grid.Column="1" Margin="2"/><!--其中第2行第1列第2--><TextBlock Text="密码" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center"/><TextBox Grid.Row="1" Grid.Column="1" Margin="2"/><!--其中第3--><CheckBox Content="记住密码" Grid.Row="2" Grid.ColumnSpan="2" /><!--其中第4--><Button Grid.Row="3" Content="登录" Grid.ColumnSpan="2"  /></Grid></Grid>
</Window>

可执行代码下载

点击下载

Step4 编写点击事件

希望:点击按钮后,获得用户名和密码。
需要对相应的txtBox设置别名。
部分修改代码如下:【注意x:Name和Click】

            <!--其中第1行第1--><TextBlock Text="用户名" Grid.Row="0" Grid.Column="0" VerticalAlignment="Center"/><!--其中第1行第2--><TextBox x:Name="txtUsername" Grid.Row="0" Grid.Column="1" Margin="2"/><!--其中第2行第1列第2--><TextBlock Text="密码" Grid.Row="1" Grid.Column="0" VerticalAlignment="Center"/><TextBox x:Name="txtPassword" Grid.Row="1" Grid.Column="1" Margin="2"/><!--其中第3--><CheckBox Content="记住密码" Grid.Row="2" Grid.ColumnSpan="2" /><!--其中第4--><Button Grid.Row="3" Content="登录" Grid.ColumnSpan="2" Click="Button_Click" />

Button_Click事件中代码为:

        private void Button_Click(object sender, RoutedEventArgs e){string username = txtUsername.Text;string password = txtPassword.Text;if(username=="wpf" && password == "admin"){MessageBox.Show("OK");//弹出新界面}else{//弹出警告框MessageBox.Show("请检查用户名或者密码是否正确!");}}

Step5 创建新WPF窗口

命名为Index,做为跳转过来的界面。
在这里插入图片描述

Step6 简单写点Index内容

在这里插入图片描述

Step7 跳转到Index

在Main中对Index进行实例化,然后让其显示出来。
在这里插入图片描述MainWindow.xaml.cs的核心代码:

        private void Button_Click(object sender, RoutedEventArgs e){string username = txtUsername.Text;string password = txtPassword.Text;if(username=="wpf" && password == "admin"){MessageBox.Show("OK");//弹出新界面Index indexWindow = new Index();indexWindow.Show();this.Hide();}else{//弹出警告框MessageBox.Show("请检查用户名或者密码是否正确!");}}

Index.xaml界面的核心代码:

    <Grid><ListView><ListViewItem>图书1</ListViewItem><ListViewItem>图书2</ListViewItem><ListViewItem>图书3</ListViewItem><ListViewItem>图书4</ListViewItem></ListView></Grid>

当前代码下载

C# WPF页面跳转的完整例子【登录界面跳转到子界面】代码下载


二、绑定方式

对于方式一没有使用绑定,我们想修改文本的属性值都需要回.xaml中进行修改,这是不便捷的。我们可以将.xaml中的属性和.cs中的变量进行绑定,之后只需要修改.cs中的变量值就能改变值。

绑定用户名【单向绑定】

.axml中将TextBox中的Text属性值和一个名为UserName的变量绑定在一起。【如下图所示】
在这里插入图片描述
而UserName变量是在对应的.cs文件中,需要声明变量,再在初始化时声明绑定的数据是这个页面中的。【如下图所示】
在这里插入图片描述

双向绑定

DataContext属性用于关联一个对象给它以便进行视图绑定。当你将一个控件(例如MainWindow)的DataContext设置为一个对象(在这里是LoginModel实例)时,那么这个对象将能够通过数据绑定的方式访问到它的属性。
在这里插入图片描述

namespace WPF_LoginUI
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window,INotifyPropertyChanged{public MainWindow(){InitializeComponent();this.DataContext = this;    }public event PropertyChangedEventHandler PropertyChanged;private void RaisePropertyChanged(string propertyName){PropertyChangedEventHandler handler = PropertyChanged;if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); }}private string _UserName;public string UserName{get { return _UserName; }set{_UserName = value;RaisePropertyChanged("UserName");}}private string _Password;public string Password{get { return _Password; }set{_Password = value;RaisePropertyChanged("Password");}}private void Button_Click(object sender, RoutedEventArgs e){if(UserName=="wpf" && Password == "admin"){MessageBox.Show("OK");//弹出新界面Index indexWindow = new Index();indexWindow.Show();this.Hide();}else{//弹出警告框MessageBox.Show("请检查用户名或者密码是否正确!");UserName = "";Password = "";txtUsername.Focus();}}}
}

代码提供

点击下载

三、MVVM

方式1: 拆出模型

即提取出数据模型。下图中,我们创建了LoginModel类,实现了INotifyPropertyChanged接口,用RaisePropertyChanged方法用于在属性值改变时通知视图更新。

下图是个典型的MVVM模式的模型部分,它实现了绑定通知接口,这样当其中任何一个属性的值发生变化时,视图(例如UI界面)可以在不了解如何访问模型的特定实现细节的情况下获取这些改变。这是一种解耦的方式
在这里插入图片描述
this.DataContext = loginModel;这行代码就是在告诉WPF框架,所有的控件需要绑定的数据源都是来自于loginModel,这样登录界面上的UserName和Password输入框(如{Binding Path=UserName},{Binding Path=Password}等)都可以找到正确的来源。
在这里插入图片描述
当前代码:

namespace WPF_LoginUI
{/// <summary>/// MainWindow.xaml 的交互逻辑/// </summary>public partial class MainWindow : Window{LoginModel loginModel;public MainWindow(){InitializeComponent();loginModel =new LoginModel();this.DataContext = loginModel;    }private void Button_Click(object sender, RoutedEventArgs e){if(loginModel.UserName=="wpf" && loginModel.Password == "admin"){MessageBox.Show("OK");//弹出新界面Index indexWindow = new Index();indexWindow.Show();this.Hide();}else{//弹出警告框MessageBox.Show("请检查用户名或者密码是否正确!");loginModel.UserName = "";loginModel.Password = "";txtUsername.Focus();}}}public class LoginModel : INotifyPropertyChanged{public event PropertyChangedEventHandler PropertyChanged;private void RaisePropertyChanged(string propertyName){PropertyChangedEventHandler handler = PropertyChanged;if (handler != null) { handler(this, new PropertyChangedEventArgs(propertyName)); }}private string _UserName;public string UserName{get { return _UserName; }set{_UserName = value;RaisePropertyChanged("UserName");}}private string _Password;public string Password{get { return _Password; }set{_Password = value;RaisePropertyChanged("Password");}}}
}

代码下载

代码下载


方式2 View Model

下面的部分根据视频来做的,但是问了AI后,提示我下面的代码还是不符合MVVM框架的,这点需要注意。
首先,创建两个类:LoginViewModel和LoginModel。在LoginViewModel中实现接口和将LoginModel类做为属性。

LoginViewModel类

在这里插入图片描述

LoginModel类

在这里插入图片描述

MainWindow类

在这里插入图片描述

mainWindow.axml

在这里插入图片描述

代码下载

代码下载


更新时间

  • 2025-02-07:创建。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/70454.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vivado 7 系列器件时钟

7 系列器件时钟 注释&#xff1a; 本章节以 Virtex -7 时钟源为例。 Virtex-6 的时钟资源与此类似。如果使用不同的架构&#xff0c;请参阅有关器件的 《时 钟资源指南》 [ 参照 40] 。 Virtex-6 和 Virtex-7 器件内含 32 个称为 BUFG 的全局时钟缓存。 BUFG 可满…

无须付费,安装即是完全版!

不知道大家有没有遇到过不小心删掉了电脑上超重要的文件&#xff0c;然后急得像热锅上的蚂蚁&#xff1f; 别担心&#xff0c;今天给大家带来一款超给力的数据恢复软件&#xff0c;简直就是拯救文件的“救星”&#xff01; 数据恢复 专业的恢复数据软件 这款软件的界面设计得特…

【图片合并转换PDF】如何将每个文件夹下的图片转化成PDF并合并成一个文件?下面基于C++的方式教你实现

医院在为患者进行诊断和治疗过程中&#xff0c;会产生大量的医学影像图片&#xff0c;如 X 光片、CT 扫描图、MRI 图像等。这些图片通常会按照检查时间或者检查项目存放在不同的文件夹中。为了方便医生查阅和患者病历的长期保存&#xff0c;需要将每个患者文件夹下的图片合并成…

Racecar Gym 总结

1.Racecar Gym 简介 Racecar Gym 是一个基于 PyBullet 物理引擎 的自动驾驶仿真平台&#xff0c;提供 Gymnasium&#xff08;OpenAI Gym&#xff09; 接口&#xff0c;主要用于强化学习&#xff08;Reinforcement Learning, RL&#xff09;、多智能体竞速&#xff08;Multi-Ag…

基于微信小程序的医院预约挂号系统的设计与实现

hello hello~ &#xff0c;这里是 code袁~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生…

智体链:大语言模型协作完成长上下文任务

25年1月来自Penn State U和谷歌云的论文“Chain of Agents: Large Language Models Collaborating on Long-Context Tasks”。 解决有效处理长上下文的挑战已成为大语言模型 (LLM) 的关键问题。出现了两种常见策略&#xff1a;1&#xff09;减少输入长度&#xff0c;例如通过检…

java s7接收Byte字节,接收word转16位二进制

1图&#xff1a; 2.图&#xff1a; try {List list getNameList();//接收base64S7Connector s7Connector S7ConnectorFactory.buildTCPConnector().withHost("192.168.46.52").withPort(102).withTimeout(1000) //连接超时时间.withRack(0).withSlot(3).build()…

机器学习在癌症分子亚型分类中的应用

学习笔记&#xff1a;机器学习在癌症分子亚型分类中的应用——Cancer Cell 研究解析 1. 文章基本信息 标题&#xff1a;Classification of non-TCGA cancer samples to TCGA molecular subtypes using machine learning发表期刊&#xff1a;Cancer Cell发表时间&#xff1a;20…

Redis --- 使用HyperLogLog实现UV(访客量)

UV 和 PV 是网站或应用数据分析中的常用指标&#xff0c;用于衡量用户活跃度和页面访问量。 UV (Unique Visitor 独立访客)&#xff1a; 指的是在一定时间内访问过网站或应用的独立用户数量。通常根据用户的 IP 地址、Cookies 或用户 ID 等来唯一标识一个用户。示例&#xff1…

大学资产管理系统中的下载功能设计与实现

大学资产管理系统是高校信息化建设的重要组成部分&#xff0c;它负责记录和管理学校内所有固定资产的信息。随着信息技术的发展&#xff0c;下载功能成为提高资产管理效率的关键环节之一。 系统架构的设计是实现下载功能的基础。一个良好的系统架构能够确保数据的高效传输和存储…

Vue 3 中的 el-tooltip 详解:语法、示例及与其他框架对比

目录 前言1. 基本知识2. 实战Demo 前言 &#x1f91f; 找工作&#xff0c;来万码优才&#xff1a;&#x1f449; #小程序://万码优才/r6rqmzDaXpYkJZF 1. 基本知识 el-tooltip 是 Element Plus&#xff08;Vue 3 组件库&#xff09;中的一个用于提示的组件&#xff0c;它可以在…

Day 31 卡玛笔记

这是基于代码随想录的每日打卡 491. 非递减子序列 给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出现两个整数相等&#xff0…

docker /var/lib/docker/overlay2目录把磁盘空间占满问题

1、查看服务器磁盘空间 df -h果然100%了,docker系统文件把磁盘空间占满了。 2、进入overlay2目录&#xff0c;查找那个容器工作目录占用最高 cd /var/lib/docker/overlay2du -h --max-depth1详见下图 好家伙占用110G&#xff01;复制目录名称2c3c48ccac533c5d4a366d45a19bb9…

02vue3实战-----项目目录详解

02vue3实战-----项目目录详解 1.目录完整结构2.extensions.json文件3.node_modules文件夹4.public文件夹5.src文件夹6.文件.gitignore7.文件env.d.ts8.文件index.html9.文件package-lock.json和文件package.json10.文件README.md11.文件vite.config.ts12.文件tsconfig.json和文…

【蓝桥杯嵌入式】4_key:单击+长按+双击

全部代码网盘自取 链接&#xff1a;https://pan.baidu.com/s/1PX2NCQxnADxYBQx5CsOgPA?pwd3ii2 提取码&#xff1a;3ii2 1、电路图 将4个按键的引脚设置为input&#xff0c;并将初始状态设置为Pull-up&#xff08;上拉输入&#xff09; 为解决按键抖动的问题&#xff0c;我们…

qt部分核心机制

作业 1> 手动将登录项目实现&#xff0c;不要使用拖拽编程 并且&#xff0c;当点击登录按钮时&#xff0c;后台会判断账号和密码是否相等&#xff0c;如果相等给出登录成功的提示&#xff0c;并且关闭当前界面&#xff0c;发射一个跳转信号&#xff0c;如果登录失败&#…

Spring Boot启动内嵌tocmat原理

要研究Spring Boot启动内嵌tomcat的原理&#xff0c;就需要先了解一下Spring Boot自动配置的过程&#xff0c;首先简要的梳理一下springboot自动配置的步骤。 一、SpringBoot自动配置 当SpringBoot应用启动时&#xff0c;EnableAutoConfiguration注解被激活&#xff0c;该注解…

【论文阅读】Comment on the Security of “VOSA“

Comment on the Security of Verifiable and Oblivious Secure Aggregation for Privacy-Preserving Federated Learning -- 关于隐私保护联邦中可验证与遗忘的安全聚合的安全性 论文来源摘要Introduction回顾 VOSA 方案对VOSA不可伪造性的攻击对于类型 I 的攻击对于类型 II 的…

idea隐藏无关文件

idea隐藏无关文件 如果你想隐藏某些特定类型的文件&#xff08;例如 .log 文件或 .tmp 文件&#xff09;&#xff0c;可以通过以下步骤设置&#xff1a; 打开设置 在菜单栏中选择 File > Settings&#xff08;Windows/Linux&#xff09;或 IntelliJ IDEA > Preference…

x64、aarch64、arm与RISC-V64:详解四种处理器架构

x64、aarch64、arm与RISC-V64:详解四种处理器架构 x64架构aarch64架构ARM架构RISC-V64架构总结与展望在计算机科学领域,处理器架构是构建计算机系统的基石,它决定了计算机如何执行指令、管理内存和处理数据。x64、aarch64、arm与RISC-V64是当前主流的四种处理器架构,它们在…