WPF实战学习笔记32-登录、注册服务添加
增加全局账户名同步
增加静态变量
添加文件:Mytodo.Common.Models.AppSession.cs
ausing Prism.Mvvm;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;namespace Mytodo.Common.Models
{public class AppSession{private static String userName;/// <summary>/// A static property which you'd like to bind to/// </summary>public static String UserName{get{return userName;}set{userName = value;// Raise a change eventOnUserNameChanged(EventArgs.Empty);}}// Declare a static event representing changes to your static propertypublic static event EventHandler UserNameChanged;// Raise the change event through this static methodprotected static void OnUserNameChanged(EventArgs e){EventHandler handler = UserNameChanged;if (handler != null){handler(null, e);}}static AppSession(){// Set up an empty event handlerUserNameChanged += (sender, e) => { return; };}}
}
修改MainView绑定
- 增加命名空间
xmlns:model="clr-namespace:Mytodo.Common.Models"
- 修改textblock绑定
<TextBlockMargin="0,10"HorizontalAlignment="Center"Text="{Binding Path=(model:AppSession.UserName)}" />
给账户名赋值
修改Mytodo.ViewModels.LoginViewModel.cs
async private void Login()
{if (string.IsNullOrWhiteSpace(Account) ||string.IsNullOrWhiteSpace(Password)){aggregator.SendMessage("密码或账户为空,请重新输入", "Login");return;}var loginResult = await loginService.Login(new UserDto(){Account = Account,PassWord = Password});if (loginResult != null && loginResult.Status){//UserDto myuser= new UserDto() { UserName=loginResult.Result }// AppSession.UserNameAppSession.UserName = (loginResult.Result as UserDto).UserName;RequestClose?.Invoke(new DialogResult(ButtonResult.OK));return;}else{//登录失败提示...aggregator.SendMessage("密码或账户错误,请重新输入", "Login");}
}
添加注销功能
添加注销方法
修改文件:Mytodo.app.xaml.cs
public static void LoginOut(IContainerProvider containerProvider)
{Current.MainWindow.Hide();var dialog = containerProvider.Resolve<IDialogService>();dialog.ShowDialog("LoginView", callback =>{if (callback.Result != ButtonResult.OK){Environment.Exit(0);return;}Current.MainWindow.Show();});
}
添加注销命令,并初始化
修改文件:Mytodo.ViewModels.MainViewModel.cs
using Mytodo.Common;
using Mytodo.Common.Models;
using Mytodo.Extensions;
using Prism.Commands;
using Prism.Ioc;
using Prism.Mvvm;
using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;namespace Mytodo.ViewModels
{public class MainViewModel : BindableBase, IConfigureInterface{public MainViewModel(IRegionManager regm, IContainerProvider provider){MenuBars = new ObservableCollection<MenuBar>();//区域赋值this.regionManager = regm;this.provider = provider;//初始化命令操作NavigateCmd = new DelegateCommand<MenuBar>(Navigate);LoginOutCommand = new DelegateCommand(Logout);//实例化命令GoBackCmd = new DelegateCommand(() =>{if (journal != null && journal.CanGoBack)journal.GoBack();});GoFwrdCmd = new DelegateCommand(() =>{if (journal != null && journal.CanGoForward)journal.GoForward();});}private void Logout(){App.LoginOut(provider);}//添加变量private readonly IRegionManager regionManager;private readonly IContainerProvider provider;private IRegionNavigationJournal journal;//添加命令public DelegateCommand LoginOutCommand { get; set; }public DelegateCommand<MenuBar> NavigateCmd { get; private set; }/// <summary>/// 导航返回命令/// </summary>public DelegateCommand GoBackCmd { get; private set; }/// <summary>/// 导航前进命令/// </summary>public DelegateCommand GoFwrdCmd { get; private set; }//命令方法private void Navigate(MenuBar obj){if (obj == null || string.IsNullOrWhiteSpace(obj.NameSpace))return;regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(obj.NameSpace, back =>{journal = back.Context.NavigationService.Journal;});}private ObservableCollection<MenuBar> menuBars;public ObservableCollection<MenuBar> MenuBars{get { return menuBars; }set { menuBars = value; RaisePropertyChanged(); }}void CreatMenuBar(){MenuBars.Add(new MenuBar { Icon = "Home", NameSpace = "IndexView", Title = "首页" });MenuBars.Add(new MenuBar { Icon = "FormatListChecks", NameSpace = "TodoView", Title = "待办事项" });MenuBars.Add(new MenuBar { Icon = "Notebook", NameSpace = "MemoView", Title = "备忘录" });MenuBars.Add(new MenuBar { Icon = "Cog", NameSpace = "SettingsView", Title = "设置" });}public void Configure(){CreatMenuBar();//导航到主页regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate("IndexView");}}
}
修改xaml,增加注销按钮
<materialDesign:PopupBox Panel.ZIndex="1"><materialDesign:PopupBox.ToggleContent><ImageWidth="50"Height="50"Margin="16,0,0,0"Source="../Images/user.jpg"><Image.Clip><EllipseGeometryCenter="25,25"RadiusX="25"RadiusY="25" /></Image.Clip></Image></materialDesign:PopupBox.ToggleContent><StackPanel><!--<Button Command="{Binding AppCenterCommand}" Content="个人中心"/>--><Button Command="{Binding LoginOutCommand}" Content="注销当前账户" /></StackPanel>
</materialDesign:PopupBox>
首页添加用户名和时间
修改文件:Mytodo.ViewModels.IndexViewModel.cs
public DateTime CurrTime
{get { return currTime; }set { currTime = value; RaisePropertyChanged(); }
}
private string title;public string Title
{get { return title; }set { title = value; RaisePropertyChanged(); }
}
private DateTime currTime;
private async void RefreshTimeAsync()
{while (true){await Task.Delay(1000);CurrTime = DateTime.Now;Title = "您好 " + AppSession.UserName + ", 现在是: " + currTime.ToString("yy-MM-dd") + " " + currTime.ToString("HH:MM:ss") + " " + currTime.ToString("ddd");}
}
public IndexViewModel(IContainerProvider provider,IDialogHostService dialog) : base(provider)
{//实例化接口this.toDoService = provider.Resolve<ITodoService>();this.memoService = provider.Resolve<IMemoService>();this.summService = provider.Resolve<ISummeryService>();this.regionManager = provider.Resolve<IRegionManager>();//初始化命令EditMemoCmd = new DelegateCommand<MemoDto>(Addmemo);EditTodoCmd = new DelegateCommand<ToDoDto>(Addtodo);ToDoCompltedCommand = new DelegateCommand<ToDoDto>(Compete);ExecuteCommand = new DelegateCommand<string>(Execute);NavigateCommand = new DelegateCommand<TaskBar>(Navigate);this.dialog = dialog;CreatBars();RefreshTimeAsync();
}
修改bug
修改服务接口
修改ExecuteAsync()函数,修改HttpRestClient文件
using Newtonsoft.Json;
using RestSharp;
using RestSharp.Extensions;
using RestSharp.Serializers;
using RestSharp.Authenticators;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MyToDo.Share;
using MyToDo.Share.Models;
using Microsoft.AspNetCore.Http;namespace Mytodo.Service
{/// <summary>/// Http本地客户端/// </summary>public class HttpRestClient{private readonly string? apiUrl;protected readonly RestClient? client;public HttpRestClient(string apiUrl){this.apiUrl = apiUrl;client = new RestClient();}/// <summary>/// 异步执行/// </summary>/// <param name="baseRequest"></param>/// <returns></returns>public async Task<ApiResponse> ExecuteAsync(BaseRequest baseRequest){var request = new RestRequest(baseRequest.Method);request.AddHeader("Content-Type", baseRequest.ContentType);if (baseRequest.Parameter != null)request.AddParameter("param", JsonConvert.SerializeObject(baseRequest.Parameter), ParameterType.RequestBody);client.BaseUrl = new Uri(apiUrl + baseRequest.Route);var response = await client.ExecuteAsync(request);var apires = JsonConvert.DeserializeObject<ApiResponse>(response.Content);if (apires.Status){///return JsonConvert.DeserializeObject<ApiResponse>(response.Content);return new ApiResponse(){Status = true,Result = JsonConvert.DeserializeObject<UserDto>(apires.Result.ToString()),Message = ""};} elsereturn new ApiResponse(){Status = false,Result = null,Message = response.ErrorMessage};}public async Task<ApiResponse<T>> ExecuteAsync<T>(BaseRequest baseRequest){var request = new RestRequest(baseRequest.Method);request.AddHeader("Content-Type", baseRequest.ContentType);if (baseRequest.Parameter != null)request.AddParameter("param", JsonConvert.SerializeObject(baseRequest.Parameter), ParameterType.RequestBody);client.BaseUrl = new Uri(apiUrl + baseRequest.Route);var response = await client.ExecuteAsync(request);if (response.StatusCode == System.Net.HttpStatusCode.OK)return JsonConvert.DeserializeObject<ApiResponse<T>>(response.Content);elsereturn new ApiResponse<T>(){Status = false,Message = response.ErrorMessage};}}
}
调换注册界面数据绑定
<TextBoxMargin="0,5"md:HintAssist.Hint="请输入用户名"DockPanel.Dock="Top"Text="{Binding RUserDto.UserName}" />
<TextBoxMargin="0,5"md:HintAssist.Hint="请输入账号"DockPanel.Dock="Top"Text="{Binding RUserDto.Account}" />
相关文章:
WPF实战学习笔记32-登录、注册服务添加
增加全局账户名同步 增加静态变量 添加文件:Mytodo.Common.Models.AppSession.cs ausing Prism.Mvvm; using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Text; using System.Threading.Tasks; us…...
XGBoost的参数
目录 1. 迭代过程 1.1 迭代次数/学习率/初始𝐻最大迭代值 1.1.1 参数num_boost_round & 参数eta 1.1.2 参数base_score 1.1.3 参数max_delta_step 1.2 xgboost的目标函数 1.2.1 gamma对模型的影响 1.2.2 lambda对模型的影响 2. XGBoost的弱评估器 2.…...

【已解决】windows7添加打印机报错:加载Tcp Mib库时的错误,无法加载标准TCP/IP端口的向导页
windows7 添加打印机的时候,输入完打印机的IP地址后,点击下一步,报错: 加载Tcp Mib库时的错误,无法加载标准TCP/IP端口的向导页 解决办法: 复制以下的代码到新建文本文档.txt中,然后修改文本文…...

用于紫外线消毒灯的LED驱动:数明深紫外消毒方案SLM201
用于紫外线消毒灯的LED驱动SLM201 应用于紫外线消毒灯的LED驱动。疫情过后让越来越多的人开始注重起个人健康,除了出门佩戴口罩外,对于居家消毒也越发重视起来。而居家消毒除了75%浓度酒精及各类消毒液外,利用紫外线灯给衣物表面、房间消毒也…...

Docker部署Springboot应用【mysql部署+jar部署+Nginx部署】
【项目达到目标】 1.基本准备 2、mysql部署 3、jar部署 4、Nginx部署 一、基本准备 石工拿的就是之前放置在我们服务器上的应用进行部署,主要就是mysql和jar还有Vue的部署。 目前已经有的是jar、已经打包好的vue 二、mysql部署 docker run -d --name mysql \ …...

EMC VNX1系列存储电池状态说明
SPS电池正常的状态为“Present”。 SPS电池故障时的状态为“Faulted”。 更换SPS后,SPS开始充电,此时状态显示为“Not Ready”状态。 充电完成后显示为Present状态。如果充电完成后状态前面有“F”标记,则需要重启对应的控制器以更新SPS…...
pyspark 判断 Hive 表是否存在
Catalog.tableExists(tableName: str, dbName: Optional[str] None) → booltableName:表名 dbName:库名(可选) return:bool 值 spark SparkSession \.builder \.appName(tableExists) \.config(spark.num.executors, 6) \.config(spark.executor.memo…...

选择排序算法
选择排序 算法说明与代码实现: 以下是使用Go语言实现的选择排序算法示例代码: package mainimport "fmt"func selectionSort(arr []int) {n : len(arr)for i : 0; i < n-1; i {minIndex : ifor j : i 1; j < n; j {if arr[j] < a…...

快速了解MyBatis---映射关系多对一
文章目录 映射关系多对一映射关系-官方文档映射关系多对1-基本介绍基本介绍注意细节 映射关系多对1-映射方式映射方式配置Mapper.xml 方式-应用实例注解实现多对1 映射-应用实例 映射关系多对一 映射关系-官方文档 文档地址: https://mybatis.org/mybatis-3/zh/sqlmap-xml.ht…...

python学到什么程度算入门,python从入门到精通好吗
本篇文章给大家谈谈python学到什么程度算入门,以及python从入门到精通好吗,希望对各位有所帮助,不要忘了收藏本站喔。 学习 Python 之 进阶学习 一切皆对象 1. 变量和函数皆对象2. 模块和类皆对象3. 对象的基本操作 (1). 可以赋值给变量(2). …...

整数规划——第一章 引言
整数规划——第一章 引言 整数规划是带整数变量的最优化问题,即最大化或最小化一个全部或部分变量为整数的多元函数受约束于一组等式和不等式条件的最优化问题。许多经济、管理、交通、通信和工程中的最优化问题都可以用整数规划来建模。 考虑一个电视机工厂的生产…...

C语言结构体讲解
目录 结构体的声明 结构的基础知识 结构的声明 为什么要出现结构体? 结构成员的类型 结构体变量的定义和初始化 定义:(全局变量//局部变量) 初始化: 结构体成员的访问 结构体传参 结构体的声明 结构的基础知识…...

021 - STM32学习笔记 - Fatfs文件系统(三) - 细化与总结
021 - STM32学习笔记 - Fatfs文件系统(三) - 细化与总结 上节内容中,初步实现了FatFs文件系统的移植,并且实现了设备的挂载、文件打开/关闭与读写功能,这里对上节遗留的一些问题进行总结,并且继续完善文件…...

jQuery如何获取动态添加的元素
jQuery如何获取动态添加的元素 使用 on()方法 本质上使用了事件委派,将事件委派在父元素身上 自 jQuery 版本 1.7 起,on() 方法是 bind()、live() 和 delegate() 方法的新的替代品,但是由于on()方法必须有事件,没有事件时可选择de…...

Keepalived 在CentOS 7安装并配置监听MySQL双主
keepalived安装 MySQL双主配置请看这里:https://tongyao.blog.csdn.net/article/details/132016200?spm1001.2014.3001.5502 128、129两台服务器安装步骤相同,配置文件不同,下面有介绍。 1.安装相关依赖包,并下载keepalived安…...

深度学习,神经网络介绍
目录 1.神经网络的整体构架 2.神经网络架构细节 3.正则化与激活函数 4.神经网络过拟合解决方法 1.神经网络的整体构架 ConvNetJS demo: Classify toy 2D data 我们可以看看这个神经网络的网站,可以用来学习。 神经网络的整体构架如下1: 感知器&…...

中国AI大模型峰会“封神之作”!开发者不容错过这场夏季盛会
年度最强大模型顶会来袭!喊话中国数百万AI开发者,速来! 硬核来袭!中国AI大模型峰会“封神之作”,开发者们不容错过! 前瞻大模型发展趋势,紧跟这场大会! 中国科技超级碗,大模型最新前…...

Android Studio多渠道打包
使用环境: Android studio 多渠道打包 使用方法: 1 APP下build.gradle文件 flavorDimensions "default"productFlavors {huawei {dimension "default"manifestPlaceholders [ channel:"huawei" ]}xiaomi {dimension &…...
RK3566 Android11默认客户Launcher修改
前言 客户需要默认自己的Launcher为home,同时保留系统的Launcher3. 解决办法:在启动home应用之前设置一下默认Launcher。查找home app启动相关资料,找到了frameworks/base/services/core/java/com/android/server/wm/RootWindowContainer.java的startHomeOnTaskDisplayA…...

ORB算法在opencv中实现方法
在OPenCV中实现ORB算法,使用的是: 1.实例化ORB orb cv.xfeatures2d.orb_create(nfeatures)参数: nfeatures: 特征点的最大数量 2.利用orb.detectAndCompute()检测关键点并计算 kp,des orb.detectAndCompute(gray,None)参数:…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...

51c自动驾驶~合集58
我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留,CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制(CCA-Attention),…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
VTK如何让部分单位不可见
最近遇到一个需求,需要让一个vtkDataSet中的部分单元不可见,查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行,是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示,主要是最后一个参数,透明度…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

ios苹果系统,js 滑动屏幕、锚定无效
现象:window.addEventListener监听touch无效,划不动屏幕,但是代码逻辑都有执行到。 scrollIntoView也无效。 原因:这是因为 iOS 的触摸事件处理机制和 touch-action: none 的设置有关。ios有太多得交互动作,从而会影响…...