概述

  • 登录窗体无论在bs还是cs中都很常见,使用winform或者wpf ui进行设计都相对比较简单,但是如果在WPF框架,比如:Caliburn.Micro下,设计一个符合MVVM思想的登录窗体就相对有了点难度,因为CM框架本身的设计理念是VM first而非View first.接下来开始讲解我的设计.

后台设计

  • 数据模型:定义一个用户登录类,类中囊括三个属性

    public class UserInformation{public UserInformation(){UserName = "zls20210502";Password = "123456";}/// <summary>/// 用户名/// </summary>public string UserName { get; set; }/// <summary>/// 密码/// </summary>public string Password { get; set; }/// <summary>/// 性别/// </summary>public int Gender { get; set; }}
  • 登录信息验证:这里按理应该增加注册信息,应该是个list,我只是举例写了一组:

    public string ValidateLoginData(){StringBuilder sb = new StringBuilder();if (UserInformation.UserName == "zls20210502"&& UserInformation.Password == "12345678"){sb.Append("");}else{sb.AppendLine("账号或者密码输入有误,请检查!");}return sb.ToString();}
  • 登录方法:这里首先验证登录信息,验证失败就弹窗提示报错信息,否则通过GetView()方法获取当前view并隐藏,然后通过IOC获取IWindowManager,再通过ShowDialog显示主窗体,这几个方法都CM框架集成的方法.登录窗体需要继承Screen.

    public void BtnLogin(){var str = ValidateLoginData();if(!string.IsNullOrEmpty(str)){MessageBox.Show(str);}else {var loginWindow = (Window)this.GetView();loginWindow.Hide();MainWindowViewModel mainWindowViewModel = new MainWindowViewModel();IWindowManager windowManager = IoC.Get<IWindowManager>();windowManager.ShowDialog(mainWindowViewModel);this.TryClose();}}

前台设计

  • 前台的密码框采用dev下的PasswordBoxEdit,因为wpf自带的PasswordBox的Password不支持绑定:

全部代码如下:

<Window x:Class="Caliburn.Micro.Hello.LoginView"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:dxe="http://schemas.devexpress.com/winfx/2008/xaml/editors"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"WindowStyle="None" AllowsTransparency="True" Background="{x:Null}"Title="LoginWindow" Height="320" Width="300" WindowStartupLocation="CenterScreen"><Grid  Width="{Binding Width, ElementName=w}" Height="{Binding Height, ElementName=w}"><Grid.RowDefinitions><RowDefinition Height="150" /><RowDefinition Height="50" /><RowDefinition Height="50" /><RowDefinition  /></Grid.RowDefinitions><Border Grid.RowSpan="4" BorderBrush="Gray" BorderThickness="3" CornerRadius="20" Margin="10"  Opacity="1"  Background="White"></Border><Button  Name="BtnClose"  Grid.Row="0" Margin="20" Width="48" Height="48"  BorderBrush="{x:Null}" Background="{x:Null}"HorizontalAlignment="Right" VerticalAlignment="Top"><Image Source="/Images/exit1.png"/></Button><Image Grid.Row="0"  VerticalAlignment="Center" Width="120"  Height="120" Source="/Images/login.png" /><TextBox x:Name="UserTextBox" Text="{Binding UserInformation.UserName}"  Grid.Row="1"  Width="200" VerticalAlignment="Bottom" BorderThickness="0,0,0,1" Height="25"></TextBox><TextBlock Foreground="DarkGray"  Grid.Row="1"  IsHitTestVisible="False" HorizontalAlignment="Center" Height="25" Text="请输入用户名" VerticalAlignment="Bottom" Width="90" FontFamily="Microsoft YaHei"><TextBlock.Style><Style TargetType="{x:Type TextBlock}"><Setter Property="Visibility" Value="Collapsed"/><Style.Triggers><DataTrigger Binding="{Binding Text, ElementName=UserTextBox}" Value=""><Setter Property="Visibility" Value="Visible"/></DataTrigger></Style.Triggers>
</Style></TextBlock.Style></TextBlock><dxe:PasswordBoxEdit  x:Name="PwdTextBox" Text="{Binding UserInformation.Password}"  Grid.Row="2"  Width="200" VerticalAlignment="Bottom" BorderThickness="0,0,0,1" Height="25"></dxe:PasswordBoxEdit><TextBlock Foreground="DarkGray" Grid.Row="2"  IsHitTestVisible="False" HorizontalAlignment="Center" Height="25" Text="请输入密码" VerticalAlignment="Bottom" Width="90" FontFamily="Microsoft YaHei"><TextBlock.Style><Style TargetType="{x:Type TextBlock}"><Setter Property="Visibility" Value="Collapsed"/><Style.Triggers><DataTrigger Binding="{Binding Text, ElementName=PwdTextBox}" Value=""><Setter Property="Visibility" Value="Visible"/></DataTrigger></Style.Triggers>
</Style></TextBlock.Style></TextBlock><Button Name="BtnLogin"  Grid.Row="2"  Width="48" Margin="0,0,20,0"BorderBrush="{x:Null}" Background="{x:Null}" Height="48"   HorizontalAlignment="Right" VerticalAlignment="Top"><Image Source="/Images/userlogin.png"/></Button></Grid>
</Window>

效果演示

源码提取

项目下载下来先还原包,得联网的奥,确保引用的地方没有黄色感叹号,此项目还引用了几个dev的库,确保dev已经安装。

百度网盘下载链接:

https://pan.baidu.com/s/13-qYKaK0AeTVKg-FQrpcaw

提取码:0000

技术群:添加小编微信并备注进群

小编微信:mm1552923

公众号:dotNet编程大全

C# WPF做的漂亮的登陆界面[附源码]相关推荐

  1. [WPF] WPF做的漂亮的登陆界面[附源码]

    登陆界面上的logo都是从网上找的,请大家替换成自己公司的logo即可..... WPF界面库,非常漂亮的WPF界面[附源码] https://www.itsvse.com/thread-4941-1 ...

  2. 手把手教你做一个数据图表生成器(附源码)...

    我的需求:手动配置X轴.Y轴.图表标题等参数自动通过Pyecharts模块生成可视化的html数据图表,并将浏览器图表展示到UI界面上. [阅读全文] 制作出图表后的效果展示如下: 另外,生成后的图表 ...

  3. 整活--我是如何用OpenCV做了数字华容道游戏(附源码)

    学更好的别人, 做更好的自己. --<微卡智享> 本文长度为3829字,预计阅读9分钟 前言 数字华容道,记得以前<最强大脑>上一个初赛题目,正好最近家里买了个数字华容道的玩具 ...

  4. 用Python做了个图片识别系统(附源码)

    来源丨码猴小明 项目介绍 本项目将使用python3去识别图片是否为色情图片,会使用到PIL这个图像处理库,并且编写算法来划分图像的皮肤区域 介绍一下PIL: PIL(Python Image Lib ...

  5. 图片管够!用Python做了个图片识别系统(附源码)

    本项目将使用python3去识别图片是否为色情图片,会使用到PIL这个图像处理库,并且编写算法来划分图像的皮肤区域 介绍一下PIL: PIL(Python Image Library)是一种免费的图像 ...

  6. Java如何绘制一张漂亮的海报(附源码)

    需求说明 最近呢看着前端的同学使用canvas绘制漂亮的海报,刚好这次又碰到产品说又有了大展身手的机会了,果断报名,后端来完成试试.因为是B端需求,对性能也没过多的要求, 果断报名了. 如果你看了还是 ...

  7. h5 客服系统源码_Bos:做在线客服系统项目(附源码)

    题记:看过我的头条的都知道,我写文章,相比其他人而言,在格式和语言上,比较规范化,因为我认为,写头条文章不仅仅是为了个人,它更多是传播知识,因此也希望更多朋友给与我鼓励和支持,关注+转发自己有用的知识 ...

  8. 用pygame做经典坦克大战游戏(附源码)

    首先,我们得分析这个项目的结构,设计出它的框架 坦克大战游戏项目开发 需求分析 1.分析项目需要多少个类 2.分析每个类有哪些方法 1.坦克类(敌方坦克,我方坦克) 移动.射击.展示 2.子弹类 移动 ...

  9. html实现登录界面(附源码)

    一.先看效果 背景图自己设置 二.源码下载: 链接:https://zyhq.lanzoul.com/ihBmu0iy5ybi 密码:maei8 免费下载 收费下载

  10. JAVA+MySQL做一个图书信息管理系统(附源码)

    https://blog.csdn.net/weixin_43206161 实 训 报 告 书 所属课程名称 JAVA语言程序设计 题 目 图书信息管理系统 专 业 班 级 ******** 学 号 ...

最新文章

  1. 1 字节的 utf-8 序列的字节 1 无效_字节码文件结构详解
  2. android 怎么判断activity 从哪里启动的
  3. linux 文件截取
  4. struts2.0的工作原理
  5. 【机器学习算法专题(蓄力计划)】十四、机器学习中逻辑回归
  6. 弥勒市召开智慧城市建设规划设计征求意见会
  7. ssm(Spring+Spring mvc+mybatis)
  8. 【C++基础之十一】虚函数的用法
  9. iPhone 6S GPU到底多强
  10. 关于Andrdoid编程中出现BufferQueue的“queueBuffer: fence is NULL”的一种解决方案
  11. 剑指offer(C++)-JZ34:二叉树中和为某一值的路径(二)(数据结构-树)
  12. python实现散列表的链表法
  13. loadrunner 一个诡异问题
  14. 斐讯K2路由器刷机_潘多拉PandoraBox固件
  15. php加入语音播报功能_微信收付款怎么设置语音播报
  16. 两个最热门的BI软件:Tableau和Finereport
  17. 如何交叉编译fio并移植到ARM、IOT上
  18. 量化涌现:信息论方法识别多变量数据中的因果涌现
  19. Latex文献报错 Something‘s wrong--perhaps a missing \item. \end{thebibliography}
  20. 基于SSM梵杰妮纺织品公司订单管理系统

热门文章

  1. 卸载WPS后Office文档图标显示异常
  2. R可视化绘图二-ggplot2
  3. Snip ntrip caster差分数据传输,rtklib差分数据传输,rtk2go
  4. 数据库连接池——基本原理
  5. android接口和type c对比,USB Type-C究竟比3.5mm音频接口好在哪里?
  6. cocos2d-android基础教程
  7. FatFS-通用FAT文件系统详解
  8. 漫谈软件架构设计系列(一):可用性设计
  9. STM32 复位电路设计
  10. 《Nature》论文插图复刻第3期—面积图(Part2-100)