C#和WPF入门教程
目录
- 0. 来点鸡汤
- 1. 概念
- 1.1 C#能做什么
- 1.2 为什么要选择C#,而不是QT或者其它?
- 1.3 winform 和 wpf有什么区别
- 1.4 .net Framework 和 .net Core联系
- 1.5 WPF各个组成部分
- 2. xaml
- 2.1 xaml中的对象和属性
- 2.2 xaml页面布局
- 2.2.1 层级概念
- 2.2.2 使用 Grid 定义行和列
- 2.2.3 设置行和列
- 2.3 xaml样式
- 2.3.1 方法一:不给样式命名
- 2.3.2 方法二:给样式命名
- 2.3.3 给样式命名同时继承基础样式
- 2.4 在资源字典定义样式
- 2.4.1 添加资源字典
- 2.4.2 全局引用资源字典
- 2.5 控件模板重写
- 3. C# 代码语法规则
- 3.1 变量 、属性、字段分别是什么?
- 3.2 属性、变量、字段
- 变量(Variables):
- 字段(Fields):
- 属性(Properties):
- 总结区别:
- 易错点
- 3.3 set{}、get{}用法
- 3.4 App.config用法
- 3.5 将一个类拆开写在多处
- 4. 数据绑定
- 4.1 原理
- 4.2 xaml 实现数据绑定
- 案例一
- 案例二
- 4.3 C#代码实现数据绑定
- 4.4 PropertyChanged实现数据绑定
- (1)原理
- (2) 界面
- (3) xaml
- (4) c#
- 5 c#中的委托
- 5.1 如何理解委托?
- 5.2 系统自带的两种委托 Action 和Func
- 5.3 简写委托的形式
- C#中的事件
- Lambda表达式
- MVVM
- WPF 定时器
- 配置文件读取
- UI线程
- 辨识attribute和property
- 单例:加深理解静态成员和方法
- LINQ的用法
- LINQ中where用法和原理
- LINQ常用扩展方法
- split方法可能会掉入的陷阱
- 通过Linq读取配置文件
- linq常见问题
- 依赖注入
- 依赖注入 : 接口 + 实现
- 直接从类中注入
- 通过服务容器依赖注入
- 依赖注入:通过构造函数
- 配置读取
- 配置容器
- 步骤
- 实例:数据源绑定单个类
- 注册服务
- 步骤
- 实例:直接通过lambda表达式对类配置
- 实例:通过addOption配置
- 扁平化配置
- 日志系统
- 日志级别
- 日志记录到控制台
- 核心代码:
- 完整代码
- 日志记录到文本: NLog
- 官网查看例程
- Nlog核心代码
- 实例
- SeriLog: 结构化日志
- Entity Framework Core
- 通过C#代码创建表
- 通过C#对表进行怎删改查
- 插入数据/查询数据
- 删除数据/更新数据
- FluenAPI和DataAnnotation区别
- Guid用法
- Hi/Lo算法
- Migration的常用命令
- 反向工程
- EF core查询执行sql语句
- EF Core映射Mysql
- 对应关系: 关系配置在任何一方
- 一对多: 关系配置在多端
- 一对多:关系配置在一端
- EFCore性能
- 单向导航
-
0. 来点鸡汤
时不时看看自己以前写的博客,感触很多。已经快一年多没有认真写博客了,今天重新开张,希望以此为契机,重拾生活的信心。
(图片来源网络,侵删)去年研究生毕业,去了北京,年薪拿到了30万。但只在山巅呆了四个月,便草草结束,离开北京各中原由无从说起,家庭和事业那时候只能选一个。虽然选了家庭,但现在想起北京的那份工作,也觉得可惜。离开北京之后,“安安心心”拿5000的月薪又快一年了,岗位也从原来的算法工程师变成程序员,这就是上帝给你开了个窗户,你刚看到一丝希望,谁知上帝开窗就给你一个大逼兜,然后关上窗户,留下你在风中凌乱。刚去北京时,我以为命运的齿轮开始转动,我真正的人生正式开始,原来只是去看了一遭那水中花、镜中月,留存脑海中的北京梦,与现在的满地鸡毛,讽刺啊。
哈哈哈,生活还要继续呢!原来京东买东西,现在拼多多、咸鱼也能凑合,玩算法换成写代码就当给自己夯实基础,领导原来是博士、硕士,现在的领导清一色中专,这不工作上更容易忽悠领导了吗?这样想,好多了。。
听我叨逼叨那么多,哈哈,那我顺便说点关于C#的事情吧,也当做我成长的一个记录。这份教程不会每一步都去截图,如果你是小白,建议花个10分钟快速入门一下C#的基本概念,这个链接: C#菜鸟教程 带你快速入门。我写的虽然是WPF入门教程,但是C#遇到的问题我都会记录下来,直到把整个大楼给造好。
1. 概念
C# 怎么读? 读C井?读c星?哈哈
正确读音 C Sharp 音标: [ʃɑːrp]
1.1 C#能做什么
上位机软件、桌面显示软件、unity 3D游戏、网页开发等
(图片来源网络,侵删)1.2 为什么要选择C#,而不是QT或者其它?
(1)C# 简单易上手。qt 基本就C++的语法,用起来很复杂。
别扯什么运行速度,内存那些有的没的,那些东西全是扯犊子,对于新手或者绝大多数人,那些东西可能写一辈子代码也不用考虑,现在的计算机不缺算力和存储空间。主要精力应该是保证功能的实现和稳定运行。
(2)C# 是微软创造出来的,背靠宇宙第一强编辑器 visual studio,对于代码的调试,兼容,有着无可比拟的优势。
我举个例子,每台Windows电脑都有个事件查看器,它记录了电脑的各种异常事件。我们知道,写代码的时间是远远没有调试的时间长的,而用C#写的程序,通过Windows自带的事件查看器就能定位到异常代码是第几行,你就说这点,选不选C#。
(3)学会C# 会的是一类东西。
比如你是用C#写桌面应用程序(winform、WPF),你还可以用C#写网页 (asp.net),现在火热的Unity3D脚本也是通过C#来完成的,只要微软不跨,你说为啥不选一劳永逸的语言。
(图片来源网络,侵删)老子就不听傻逼博主的意见,我就要学qt。
宝啊,你看看我写的其他文章,也是鬼话连篇,但是我写博客没有糊弄各位宝,no copy,no paste.(是不是不知道啥意思,哈哈,快去百度翻译一下再和我犟)。如果你还是不选择C#,我只能画个圈诅咒你 —你写的代码如果有bug,永远也找不到。
1.3 winform 和 wpf有什么区别
C#有控制台应用程序Console,也有桌面应用程序(图形界面),现在主要就是用来展示数据的。
c#有两种方式写桌面应用程序:WPF、winform。我们来看看它们有什么不同。
- winform老,wpf新;
- winform窗体的控件属性是在C#里实现的,WPF则是在XAML里面实现的
- winform修改控件复杂,wpf简单
- winform入门简单,wpf入门难
宝啊,你读到此处想说什么?
什么傻逼博主,说了好像又啥都没说,都是些什么鬼啊?
我就想和你说,winform过时了,要学WPF。
1.4 .net Framework 和 .net Core联系
讲个小插曲,有一次其他部门的一个同事台上发言,原话:“我们这个程序是用 dot net core 开发的”,听到这句话时,我有点懵逼,什么人这是,你就说用C#开发的不就完了么,还tmd左一句dot net core,右一句dot net core,啥也不是。
看上面这张图片,我选的都是WPF,但是它们的架构不一样。
- .net Framework老, .net Core新
- .net Framework只针对windows平台,但包含了Windows平台的所有特性, .net Core 支持多个平台,但没有前者全面.如果要用xp系统,则使用framework是更好的选择
顺便说一嘴:咱可不是喜欢背后说人坏话,我批评甚至是鄙视我那个说dot net core 的同事,原因是他不写任何代码,也不会写,却总是装逼,咱讨厌这样的人。
1.5 WPF各个组成部分
分为XAML文件和cs文件,XAML文件用来处理界面,cs文件处理后台逻辑
App.xaml 指定系统启动界面,资源,引入的程序集
=======现在是 北京时间2023年9月27日 23:13,小傲娇的博主困了,不想写了
2. xaml
wpf有两部分构成,一部分是界面(前端设计),负责界面的设计和数据展示。另一部分是程序逻辑(后端),负责业务流程和数据处理。两部分相互独立,装逼的说法叫前后端分离。前端和后端会存在数据交互,可以通过事件或者绑定等方法来实现。
2.1 xaml中的对象和属性
=======现在是 北京时间2023年10月1日 20:41,小傲娇的博主今天没事,接着写。
xaml是xml的扩展,很多用法和想xml是一致的,如果你学过html,那应该会很快入门xaml,这东西只要入门了,写桌面应用程序布局时很爽,你用了这个,基本不会再用回winform了。
-
- 对象元素
这里的对象和面向对象编程的概念基本一致。面向对象编程的对象是对一类具有相同属性的物体进行抽象,比如有个Dog类、CAT类,这里的对象是逻辑层面上的。
xaml 中也有对象,比如按钮utton、文本框TextBox等都是对象,这里的对象是布局上的概念,更多是文法层面,不是逻辑上的概念。
在WPF中,xmal代码也称作前端代码(控件),而以.cs结尾的代码叫做 “C#代码”(也叫后端代码或者代码隐藏)。
按钮1
- 对象元素
-
- 属性
在C#中(其他编程语言也一样),一个类中往往有各种属性,比如学生类中有姓名属性、年纪属性等等。在xaml中,这个概念有点类似,比如有个按钮控件(按钮类),那它也有自己的属性,比如行高、行宽、背景颜色等等。下面这个示例,Grid.Row、Grid.Column都是属性。
- 属性
-
- 属性元素
属性元素是对象中的属性的属性,比如Button是一个对象,background是一个属性,对属性再设置就叫属性元素: SolidColorBrush
2.2 xaml页面布局
2.2.1 层级概念
- xaml设计是按照行和列的概念设计的;
- xaml是树形结构,在使用前先对Grid进行设计(几行几列);
- 在每个层级下面对界面进行设计
可能看了上面的图片也觉得一头雾水,我们现在从网页上随便截图一张,结合WPF看看到底什么是层级结构
我们把这个界面先整体分成三个区域, 即3行1列
第1行第1列 所有的图标依次用stackPanel放置控件就可以了
在第2行第1列 里面进一步切割,可在分成 2行1列
在第3行第1列 里面进一步切割,可在分成 1行3列
这样一个界面就被切割好了, 理解上面这个例子,应该就知道WPF层级的概念了
2.2.2 使用 Grid 定义行和列
根据上面层级的概念,将界面划分区域,接下来就可以用来实现了. 下面的代码定义2行2列的布局
我们还可以在第2行第2列里再布置2行2列,代码实现如下
2.2.3 设置行和列
-
绝对值
-
按比例
-
auto
2.3 xaml样式
2.3.1 方法一:不给样式命名
直接在wpf控件前面写某类控件的样式,该方法不给样式起名字,后面使用该类控件时不需要引用,默认会使用该类样式。如下面代码,当我创建一个按钮是就会使用 里面的样式。
=======现在是 北京时间2023年10月1日 22:38,小傲娇的博主累了,不想写了
2.3.2 方法二:给样式命名
2.3.3 给样式命名同时继承基础样式
2.4 在资源字典定义样式
在项目管理文件中添加一个资源字典Dictionary,对不同的控件进行样式设计. 在App.xaml中添加一个全局的资源字典, 将Dictionary的文件路径添加进去
2.4.1 添加资源字典
//在项目管理文件中添加一个资源字典Dictionary
2.4.2 全局引用资源字典
2.5 控件模板重写
当你创建一个控件时,这个控件有自己的背景、颜色,这都是系统自定义好的,但是这并不是我们需要的,我们不可能每一次创建时都去修改,所以需要对控件模版改造,这个过程就就叫做控件模版重写。
3. C# 代码语法规则
3.1 变量 、属性、字段分别是什么?
这个概念特别重要,搞不懂不行
类内部的私有变量即为字段,如代码中的变量 a;
属性向外暴露接口(公有部分),使外部能够通过属性访问内部字段, 属性本身不保存数据, 对属性操作实际是对属性对应字段操作; 如代码中对属性b操作,其实是对a操作;
/// /// 定义一个变量(字段) a ,同时初始化 /// private int a = 1; /// /// 定义属性 b /// public int b { get { return a; } set { a = value; } }
3.2 属性、变量、字段
在.NET中,属性(Properties)、字段(Fields)和变量(Variables)是编程中经常使用的术语,它们各自有不同的含义和用途。以下是这些术语的基本定义和区别:
变量(Variables):
- 定义:变量是用来存储数据的标识符,它可以根据程序的需要存储不同类型的数据。
- 访问:通过变量名直接访问。
- 作用域:根据声明的位置(如方法内、类内、命名空间内等),变量的作用域会有所不同。
- 示例:int number = 10;,这里number是一个整型变量。
字段(Fields):
- 定义:字段是类的成员变量,它隶属于类而不是方法。字段通常是私有的,并且可以通过类的属性、方法或其他成员来访问。
- 访问:通常通过类的实例访问,除非它们是静态的,则可以通过类名直接访问。
- 作用域:字段的作用域通常是整个类。
- 示例:
public class MyClass { private int myField; // 这是一个私有字段 public int MyProperty // 这是一个属性,下面会详细介绍 { get { return myField; } set { myField = value; } } }
属性(Properties):
- 定义:属性是类的成员,它提供了一种灵活的方式来读取、写入或计算私有字段的值。属性通常包含get和set访问器。
- 访问:通过类的实例访问,就像访问字段一样,但实际上是在调用方法。
- 作用域:属性的作用域通常是整个类,但可以通过get和set访问器进行更精细的控制。
- 示例:继续上面的MyClass例子,MyProperty是一个属性,它有get和set访问器,允许外部代码读取和修改myField的值。
public int MyProperty // 属性定义 { get { return myField; } // get访问器,用于读取属性值 set { myField = value; } // set访问器,用于设置属性值 }
总结区别:
- 变量是最基本的存储单元,而字段是类的变量成员。
- 属性提供了一种更安全、更灵活的方式来访问类的字段。它们允许在读取或写入字段值之前执行额外的逻辑(例如验证)。
- 通常建议将字段标记为private,并通过公共属性来访问它们,以实现封装和数据隐藏。这样可以确保对象状态的完整性和安全性。
-
易错点
在C#中, 只能在类内定义变量和属性,同时允许对改变量或者属性进行初始化, 但不允许一个变量直接引用另外一个变量,如下所示,这是新人经常犯的一个错误。
3.3 set{}、get{}用法
在类Test中设置一个私有变量name,同时设置一个公有变量,通过公有变量name对私有变量NAME操作
public class Test { /// /// 字段:一般私有,不对外开放, 首字母一般小写 /// private string name; /// /// 属性:一般为共有,作为外部访问对应字段的一个接口, 首字母一般大写 /// public string NAME { get { return name; } //通过NAME返回name的值 set { if (value == "keson") { Console.WriteLine("hello,keson!"); } else { name = value; //通过NAME设置name的值 Console.WriteLine("that is not keson,is "+ name); } } } } class Program { static void Main() { Test test = new Test(); test.NAME = "孙悟空"; } }
3.4 App.config用法
App.config文件是系统默认的配置文件, 使用时需要添加引用 System.Configuration.dll, 该配置文件用于修改数据库连接字符串/窗口日志的信息.
App.config代码:
-
C# 代码
拿到配置文件里的内容
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); string settingValue = System.Configuration.ConfigurationManager.AppSettings["keyName"]; } }
3.5 将一个类拆开写在多处
calss1.cs和class2.cs同属于一个类,c#允许一个类拆开写,这样防止写在一处,不方便阅读。
public partial class Window1 : Window { public Window1() { InitializeComponent(); } } public partial class Window1 : Window { public Window1() { fun(); } }
4. 数据绑定
4.1 原理
通常是指将目标源(具有依赖属性的对象)绑定到 目标数据上(通常是控件)
数据绑定分为4种:
4.2 xaml 实现数据绑定
案例一
绑定源:代码隐藏 绑定目标: TextBox
public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); //设置窗体上下文对象 这里设置的是MyClass DataContext = new MyClass(); } } public class MyClass { public int hight { get; set; } = 100; public int width { get; set; } = 101; }
案例二
绑定源:TextBox 绑定目标: TextBox
-
- 属性元素
还没有评论,来说两句吧...