WPF框架系列课程(小白进阶选择)
参考资料下载地址1:https://pan.baidu.com/s/1RzeBXGIRPbsAJcScF8xvVQ 提取码:rbp8
参考资料下载地址2:https://share.weiyun.com/VAU3sFU2 密码:9cqtcj
本文将从零基础开始讲解WPF控件、数据绑定、模板样式、资源字典、命令系统、依赖属性、路由事件、动画行为等一系列的知识,内容包含WPF的数据绑定、MVVM概念与实操、样式、模板、命令、依赖属性、路由事件、行为、自定义控件、3D、动画等高级知识,想学习wpf的小伙伴可以认真阅读本文,希望我的文章对大家有所帮助。
首先,我们先来认识wpf,那么什么是wpf呢?
WPF(Windows Presentation Foundation)是微软推出的基于Windows 的用户界面框架,属于.NET Framework 3.0的一部分。它提供了统一的编程模型、语言和框架,真正做到了分离界面设计人员与开发人员的工作;同时它提供了全新的多媒体交互用户图形界面。
谈到WPF的开发,就不能不说到MVVM,一说到MVVM,就会提及MVC、MVP等概念,那么这样一关联下来就会产生很多概念,到最后就很容易变成以概念来阐述概念,最终的结果可想而知,大家可能会一头雾水、不知所云,所以我用“漫谈WPF开发”这个小标题来阐述一下我对WPF开发的理解,当然只是自己对这些技术的总结和经验,错误之处在所难免,也希望大家能够谅解!
从2007年接触WPF和Silverlight以来,也做过一些项目了,对他们也有一些自己的理解,当然在开发这些项目的过程中也在使用其他的一些技术做项目,比如WinForm、ASP.NET(ASP.NET MVC一个项目没做完就被终止)等等,感觉不论是采用什么技术,最基本的东西都不会变,比如对数据库和文件的访问、对日志和异常的处理、对报表的展现、对打印的实现、对性能的提升、对用户的友好等等。
Windows Presentation Foundation (WPF) 是一个演示框架,可用于开发以下类型的应用程序:
独立应用程序(传统风格的 Windows 应用程序,这些应用程序作为要安装到客户端计算机并从客户端计算机运行的可执行程序集来生成)。
XAML 浏览器应用程序 (XBAP)(由导航页组成的应用程序,这些应用程序作为可执行程序集生成并由 Microsoft Internet Explorer 或 Mozilla Firefox 等 Web 浏览器托管)。
自定义控件库(包含可重用控件的非可执行程序集)。
类库(包含可重用类的非可执行程序集)。
窗口和对话框
用户通过窗口与 WPF 独立应用程序交互。 窗口旨在托管应用程序内容并提供通常允许用户与内容交互的应用程序功能。 在 WPF 中,通过 Window 类封装窗口,该类支持:
创建和显示窗口。
建立所有者/所拥有窗口关系。
配置窗口外观(例如,大小、位置、图标、标题栏文本、边框)。
对窗口的生存期进行跟踪并与之进行交互。
添加Module类,并实现Prism.Modularity.IModule接口,实现接口的模块,视为可以被Prism发现并加载的模块。以DefectListModule模块为例:
namespace DemoPrism.First{ public class FirstModule : IModule { public void OnInitialized(IContainerProvider containerProvider) { IRegionManager regionManager = containerProvider.Resolve<IRegionManager>(); regionManager.RegisterViewWithRegion("FirstRegion", typeof(Views.FirstView)); } public void RegisterTypes(IContainerRegistry containerRegistry) { containerRegistry.RegisterForNavigation<Views.FirstView, ViewModels.FirstViewModel>(); } }}
新建用户。同样,给用户定义一个主键,然后我们在本地创建这个用户
// 3. 添加用户
var adminUserId = "90184155-dee0-40c9-bb1e-b5ed07afc04e";
ApplicationUser adminUser = new ApplicationUser
{
Id = adminUserId,
UserName = "admin@fakexiecheng.com",
NormalizedUserName = "admin@fakexiecheng.com".ToUpper(),
Email = "admin@fakexiecheng.com",
NormalizedEmail = "admin@fakexiecheng.com".ToUpper(),
TwoFactorEnabled = false,
EmailConfirmed = true,
PhoneNumber = "123456789",
PhoneNumberConfirmed = false
};
首先,去数据库获得旅游路线的详细数据。这里做一个判断,如果touristRoute 不存在,touristRoute ==null, 我们需要返回响应404
接下来,给购物车创建lineitem
最后,把旅游路线当前的价格复制出来,
// 3 创建lineItem
var touristRoute = await _touristRouteRepository
.GetTouristRouteAsync(addShoppingCartItemDto.TouristRouteId);
if(touristRoute == null)
{
return NotFound("旅游路线不存在");
}
var lineItem = new LineItem()
{
TouristRouteId = addShoppingCartItemDto.TouristRouteId,
ShoppingCartId = shoppingCart.Id,
OriginalPrice = touristRoute.OriginalPrice,
DiscountPresent = touristRoute.DiscountPresent
};
接下来,我们还需要使用automapper处理model与dto的自动映射。在Profile文件夹创建一个新profile文件,文件命名OrderProfile。class继承automapper的Profile,然后在构建函数中加入model到dto的映射关系。
[HttpPost("checkout")]
[Authorize(AuthenticationSchemes = "Bearer")]
public async Task<IActionResult> Checkout()
{
// 1 获得当前用户
var userId = _httpContextAccessor
.HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value;
// 2 使用userid获得购物车
var shoppingCart = await _touristRouteRepository.GetShoppingCartByUserId(userId);
// 3 创建订单
var order = new Order()
{
Id = Guid.NewGuid(),
UserId = userId,
State = OrderStateEnum.Pending,
OrderItems = shoppingCart.ShoppingCartItems,
CreateDateUTC = DateTime.UtcNow,
};
shoppingCart.ShoppingCartItems = null;
// 4 保存数据
await _touristRouteRepository.AddOrderAsync(order);
await _touristRouteRepository.SaveAsync();
// 5 return
return Ok(_mapper.Map<OrderDto>(order));
}
全部链接添加完毕,我们就要可以返回响应了,响应数据就是links列表。现在,用户就可以通过访问这个api的根目录获得api的使用方法了。
[Route("api")]
[ApiController]
public class RootController: ControllerBase
{
[HttpGet(Name = "GetRoot")]
public IActionResult GetRoot()
{
var links = new List<LinkDto>();
// 自我链接
links.Add(
new LinkDto(
Url.Link("GetRoot", null),
"self",
"GET"
));
// 一级链接 旅游路线 “GET api/touristRoutes”
links.Add(
new LinkDto(
Url.Link("GetTouristRoutes", null),
"get_tourist_routes",
"GET"
));
// 一级链接 旅游路线 “POST api/touristRoutes”
links.Add(
new LinkDto(
Url.Link("CreateTouristRoute", null),
"create_tourist_route",
"POST"
));
// 一级链接 购物车 “GET api/orders”
links.Add(
new LinkDto(
Url.Link("GetShoppingCart", null),
"get_shopping_cart",
"GET"
));
// 一级链接 订单 “GET api/shoppingCart”
links.Add(
new LinkDto(
Url.Link("GetOrders", null),
"get_orders",
"GET"
));
return Ok(links);
}
}
- 请尽量让自己的回复能够对别人有帮助
- 支持 Markdown 格式, **粗体**、~~删除线~~、
`单行代码`
- 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
- 图片支持拖拽、截图粘贴等方式上传