一、WPF是什么?
WPF(Windows Presentation Foundation)是微软推出的用于构建Windows桌面应用程序的UI框架,属于.NET Framework的一部分。它基于DirectX实现,支持硬件加速,能够创建高性能、高保真的用户界面。
WPF的核心特性
- XAML标记语言:通过声明式XML语法设计界面,实现UI与逻辑代码分离。
- 数据绑定:支持双向绑定,自动同步数据与UI元素。
- 样式与模板:允许自定义控件外观和交互逻辑。
- 矢量图形与动画:内置支持2D/3D图形渲染和复杂动画效果。
- 文档与排版:提供流式文档(FlowDocument)和固定文档(FixedDocument)支持。
WPF的架构
- 呈现引擎:基于DirectX,确保图形渲染效率。
- 视觉树与逻辑树:通过树形结构管理UI元素层级关系。
- 依赖属性与路由事件:增强属性管理和事件处理的灵活性。
WPF的应用场景
- 企业级桌面应用(如ERP、CRM系统)。
- 需要复杂视觉效果的多媒体应用(如设计工具、交互式仪表盘)。
- 跨平台兼容性要求较低的高性能应用。
WPF与其他技术的对比
- WinForms:WPF支持更丰富的UI效果和数据绑定,但学习曲线较高。
- UWP:UWP针对现代Windows设备优化,而WPF更适合传统桌面环境。
- Electron:WPF性能优于基于Web技术的Electron,但缺乏跨平台能力。
简单的代码示例:
<Window x:Class="MyApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Hello WPF" Height="300" Width="400">
<Grid>
<Button Content="Click Me" HorizontalAlignment="Center" VerticalAlignment="Center"/>
</Grid>
</Window>
当我第一次接触WPF的时候,我觉得挺有意思的,我很喜欢。首先,我自己的认为就是它既有前端又有后端,然后全部都是在Microsoft Visual Studio 里面进行代码的编写。
二、C#又是什么?
C#(发音为“C Sharp”)是一种由微软开发的现代、面向对象的编程语言,运行于 .NET 框架上。它结合了 C++ 的高性能和 Java 的易用性,广泛应用于桌面应用、Web 开发、游戏开发(如 Unity 引擎)和移动应用等领域。
主要特点
- 类型安全:支持静态类型检查,减少运行时错误。
- 跨平台:通过 .NET Core(现为 .NET 5+)支持 Windows、Linux 和 macOS。
- 垃圾回收:自动内存管理,简化资源处理。
- 异步编程:通过
async/await语法简化多线程开发。
基础语法示例
// 输出 "Hello World"
using System;
class Program
{
static void Main()
{
Console.WriteLine("Hello World");
}
}
应用场景
- 桌面应用:通过 WPF 或 WinForms 开发。
- Web 后端:使用 ASP.NET Core 构建 RESTful API。
- 游戏开发:Unity 引擎的主要脚本语言。
- 云服务:集成 Azure 平台开发云端应用。
学习资源
- 官方文档:Microsoft Learn - C#
- 推荐书籍:《C# 9.0 in a Nutshell》
- 开发工具:Visual Studio
三、WPF与C#的关系?
WPF与C#的技术关系
WPF是微软推出的用于构建Windows桌面应用程序的UI框架,而C#是一种面向对象的编程语言。两者通常结合使用,形成现代Windows应用开发的核心技术栈。
WPF基于C#的实现
WPF的应用程序逻辑通常使用C#编写,通过XAML(可扩展应用程序标记语言)定义用户界面。C#代码负责处理业务逻辑、数据绑定和事件响应,而XAML负责UI的结构和样式。例如:
// C#代码处理按钮点击事件
private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("Hello, WPF!");
}
<!-- XAML定义按钮 -->
<Button Content="Click Me" Click="Button_Click"/>
C#在WPF中的核心作用
C#在WPF中主要用于数据绑定、命令处理和依赖属性等高级功能的实现。通过MVVM(Model-View-ViewModel)模式,C#编写的ViewModel类与XAML视图无缝交互:
public class MainViewModel : INotifyPropertyChanged
{
private string _message;
public string Message
{
get { return _message; }
set { _message = value; OnPropertyChanged(); }
}
}
运行时与编译依赖
WPF应用程序需要.NET运行时环境,而C#代码会被编译为中间语言(IL)在CLR(公共语言运行时)上执行。WPF提供了丰富的控件库和渲染引擎,这些功能通过C#代码调用实现。
开发工具链的统一
Visual Studio等IDE同时支持C#和WPF开发,提供XAML设计器、调试工具和项目模板,使得两者能够高效协同工作。WPF的样式、模板和动画等功能均通过C#代码或XAML配置实现。
四、项目的总体结构是啥?
技术栈
- 前端框架: WPF (XAML + C#)
- 架构模式: MVVM (Prism框架)
- 数据库: SQL Server + Entity Framework Core
- 工具包: MaterialDesignThemes (UI控件)、LiveCharts (数据可视化)
核心功能实现
用户管理模块
- 实现用户信息的增删改查(CRUD)
- 使用
DataGrid绑定ObservableCollection<T>实现实时数据更新。
// 示例:用户数据绑定
<DataGrid ItemsSource="{Binding UserInfoList}" CanUserAddRows="False" CanUserDeleteRows="False" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTextColumn Header="序号" Binding="{Binding Id}" />
<DataGridTextColumn Header="用户名" Binding="{Binding Name}" />
<DataGridTextColumn Header="密码" Binding="{Binding Password}" />
<DataGridTextColumn Header="角色" Binding="{Binding Role,Converter={StaticResource NumberToRoleConverter}}" />
<DataGridTextColumn Header="电话" Binding="{Binding Telephone}" />
<DataGridTextColumn Header="邮箱" Binding="{Binding Email}" />
<DataGridTextColumn Header="地址" Binding="{Binding Address}" IsReadOnly="True" />
<DataGridTextColumn Header="日期" Binding="{Binding InsertDate}" />
物资模块
- 实现物资信息的增删改查(CRUD)
- 与规格设置模块进行整合,规格设置可以对规格进行增删改操作,在物资信息中由下拉框进行匹对的规格类型
public RelayCommand<Button> EditCommand
{
get
{
var command = new RelayCommand<Button>((view) =>
{
var old = view.Tag as Goods;
if (old == null) return;
var vm = ServiceLocator.Current.GetInstance<EditGoodsViewModel>();
vm.Goods = old;
vm.GoodsType = vm.GoodsTypeList.FirstOrDefault(t=>t.Id==old.GoodsTypeId);
vm.Spec = vm.SpecList.FirstOrDefault(t => t.Id == old.SpecId);
var window = new EditGoodsWindow();
window.ShowDialog();
GoodsList = new GoodsService().Select();
});
return command;
}
}
难点与解决方案
数据同步性能
- 问题:大量库存数据加载时UI卡顿。
- 解决方案:启用EF Core的
AsNoTracking()查询,异步加载数据。
var products = await _dbContext.Products.AsNoTracking().ToListAsync();
MVVM动态绑定
- 问题:复杂表单的验证逻辑难以维护。
- 解决方案:引入
FluentValidation库,通过规则链式配置验证逻辑。
角色判断
- 问题:判断是否为管理员和普通用户
- 解决方案:判断登录时给出的Role值,当Role值为0时,为管理员,当Role值为1时,为普通用户
//在这需要进行一个转换
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return "普通用户";
if(int.TryParse(value.ToString(),out var number))
{
return number == 0 ? "管理员" : "普通用户";
}
else
{
return "普通用户";
}
}
项目成果
- 支持多线程导出Excel报表
- 实现库存盘点效率提升60%,减少人工错误。
五、总结
从这次c#WPF的项目中让我收获到了很多东西,首先我是第一次做WPF的项目,最开始我是先过了一遍WPF中一些相关的知识点,然后再去写这次项目。当我从中发现了,虽然与Winforms有些相关,但是我觉得比Winforms真的好用的多,最开始还是喜欢简单易上手的Winforms,后面真的被WPF深深的吸引住了,真的很想把它学会弄懂。我希望有一天我能通过自己的能力去完成一个自己的项目,然后被大家喜爱,被很多人认可。

1万+

被折叠的 条评论
为什么被折叠?



