WPF+c#项目开发的总结

该文章已生成可运行项目,

一、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 平台开发云端应用。

学习资源

三、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深深的吸引住了,真的很想把它学会弄懂。我希望有一天我能通过自己的能力去完成一个自己的项目,然后被大家喜爱,被很多人认可。

本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值