.NET 5 开发WPF - 美食应用登录UI设计
Demo演示:
你的时间宝贵,不想看啰嗦的文字,可直接拉到文末下载源码!
1. 新建项目
站长开发环境:
- VS 2019企业版 16.70
- .NET 5 Preview 5
.NET 5 WPF 项目模板和 .NET Core 3.1 WPF 项目模板没有区别,创建好项目后,NuGet 引入 MaterialDesignThemes 库:
2.引入样式
演示Demo就一个xaml文件和xaml.cs文件,为了方便后面收集WPF界面设计效果,统一放在了开源项目TerminalMACS.ManagerForWPF中,所以控件样式引用直接在FoodAppLoginView.xaml中添加:
<Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" /> <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" /> <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Amber.xaml" /> <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Lime.xaml" /> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Window.Resources>
3.控件动画效果
见上面GIF动画,登录窗口加载时,用户名输入框、密码输入框、记住密码、右侧背景图片等元素有动画效果,每个部分代码结构类似,比如下面的用户名输入框代码:
<!--#region User name textblox--> <materialDesign:TransitioningContent Grid.Row="2" Margin="90,20,00,0" HorizontalAlignment="Left"> <materialDesign:TransitioningContent.OpeningEffects> <materialDesign:TransitionEffect Kind="SlideInFromLeft" Duration="0:0:2"/> </materialDesign:TransitioningContent.OpeningEffects> <StackPanel Style="{StaticResource setVisibilityBasedLogin}" Orientation="Horizontal"> <materialDesign:PackIcon Kind="Account" Width="16" Height="16" VerticalAlignment="Center" Margin="0,5,10,0" Foreground="{Binding ElementName=NameTextBox, Path=BorderBrush}"/> <TextBox x:Name="NameTextBox" Width="140" materialDesign:HintAssist.Hint="{markup:I18n {x:Static i18NResources:Language.FoodAppLoginView_UserName}}" Style="{StaticResource MaterialDesignFloatingHintTextBox}"/> </StackPanel> </materialDesign:TransitioningContent> <!--#endregion-->
使用了开源控件MD的TransitioningContent组件,其中TransitionEffect的Kind属性设置控件动画方向。
4. 模拟登录
登录按钮布局代码:
<!--#region control panel--> <materialDesign:TransitioningContent Grid.Row="4" Margin="40,20,0,0"> <materialDesign:TransitioningContent.OpeningEffects> <materialDesign:TransitionEffect Kind="SlideInFromBottom" Duration="0:0:2"/> </materialDesign:TransitioningContent.OpeningEffects> <StackPanel Style="{StaticResource setVisibilityBasedLogin}" Orientation="Horizontal" HorizontalAlignment="Center"> <CheckBox Content="{markup:I18n {x:Static i18NResources:Language.FoodAppLoginView_RememberMe}}"/> <Button Style="{StaticResource MaterialDesignRaisedButton}" Command="{x:Static materialDesign:DialogHost.OpenDialogCommand}" materialDesign:ButtonAssist.CornerRadius="20" Width="80" Height="40" Margin="120,0,0,0" Content="{markup:I18n {x:Static i18NResources:Language.FoodAppLoginView_Login}}"/> </StackPanel> </materialDesign:TransitioningContent> <!--#endregion-->
点击登录时,打开等待对话框(点击时绑定了materialDesign:DialogHost.OpenDialogCommand),在等待对话框的打开与关闭事件中做登录逻辑处理。
private async Task<bool> ValidateCreds() { // 模拟登录 // 你可以发送登录信息到服务器,得到认证回馈 await Task.Delay(TimeSpan.FromSeconds(2)); Random gen = new Random(DateTime.Now.Millisecond); int loginProb = gen.Next(100); return loginProb <= 20; } private async void OpenCB_DialogOpened(object sender, MaterialDesignThemes.Wpf.DialogOpenedEventArgs eventArgs) { try { this.IsJustStarted = true; this.LoginStatusmsg = ""; bool isLoggedIn = await ValidateCreds(); if (isLoggedIn) { // 需要关闭登录对话框并显示主窗口 eventArgs.Session.Close(true); } else { // 登录失败,设置false作为参数 eventArgs.Session.Close(false); } } catch (Exception) { //throw; } } private void ClosingCB_DialogClosing(object sender, MaterialDesignThemes.Wpf.DialogClosingEventArgs eventArgs) { if (eventArgs.Parameter == null) { return; } IsLoggedIn = (bool)eventArgs.Parameter; IsJustStarted = false; if(IsLoggedIn) { this.LoginStatusmsg = I18nManager.Instance.Get(I18nResources.Language.FoodAppLoginView_Success).ToString(); } else { this.LoginStatusmsg = I18nManager.Instance.Get(I18nResources.Language.FoodAppLoginView_Fail).ToString(); } }
等待对话框打开事件中,模拟登录逻辑。
等待对话框关闭事件中,做界面响应信息。
5. 源码下载
上面只贴了部分关键代码,源码已放Github中。
参考视频:WPF Food App Login UI Material Design [Speed Design]
Demo源码:FoodAppLoginUI
时间如流水,只能流去不流回。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?