C#和WPF入门教程

03-09 1209阅读 0评论

目录

  • 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. 来点鸡汤

                                                    时不时看看自己以前写的博客,感触很多。已经快一年多没有认真写博客了,今天重新开张,希望以此为契机,重拾生活的信心。

                                                    C#和WPF入门教程,C#和WPF入门教程,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,访问,第1张
                                                    (图片来源网络,侵删)

                                                    去年研究生毕业,去了北京,年薪拿到了30万。但只在山巅呆了四个月,便草草结束,离开北京各中原由无从说起,家庭和事业那时候只能选一个。虽然选了家庭,但现在想起北京的那份工作,也觉得可惜。离开北京之后,“安安心心”拿5000的月薪又快一年了,岗位也从原来的算法工程师变成程序员,这就是上帝给你开了个窗户,你刚看到一丝希望,谁知上帝开窗就给你一个大逼兜,然后关上窗户,留下你在风中凌乱。刚去北京时,我以为命运的齿轮开始转动,我真正的人生正式开始,原来只是去看了一遭那水中花、镜中月,留存脑海中的北京梦,与现在的满地鸡毛,讽刺啊。

                                                    哈哈哈,生活还要继续呢!原来京东买东西,现在拼多多、咸鱼也能凑合,玩算法换成写代码就当给自己夯实基础,领导原来是博士、硕士,现在的领导清一色中专,这不工作上更容易忽悠领导了吗?这样想,好多了。C#和WPF入门教程

                                                    听我叨逼叨那么多,哈哈,那我顺便说点关于C#的事情吧,也当做我成长的一个记录。这份教程不会每一步都去截图,如果你是小白,建议花个10分钟快速入门一下C#的基本概念,这个链接: C#菜鸟教程 带你快速入门。我写的虽然是WPF入门教程,但是C#遇到的问题我都会记录下来,直到把整个大楼给造好。

                                                    1. 概念

                                                    C# 怎么读? 读C井?读c星?哈哈

                                                    正确读音 C Sharp 音标: [ʃɑːrp]

                                                    1.1 C#能做什么

                                                    上位机软件、桌面显示软件、unity 3D游戏、网页开发等

                                                    C#和WPF入门教程,C#和WPF入门教程,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,访问,第3张
                                                    (图片来源网络,侵删)

                                                    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#来完成的,只要微软不跨,你说为啥不选一劳永逸的语言。

                                                    C#和WPF入门教程,C#和WPF入门教程,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,使用,我们,访问,第4张
                                                    (图片来源网络,侵删)

                                                    老子就不听傻逼博主的意见,我就要学qt。

                                                    宝啊,你看看我写的其他文章,也是鬼话连篇,但是我写博客没有糊弄各位宝,no copy,no paste.(是不是不知道啥意思,哈哈,快去百度翻译一下再和我犟)。如果你还是不选择C#,我只能画个圈诅咒你 —你写的代码如果有bug,永远也找不到。

                                                    1.3 winform 和 wpf有什么区别

                                                    C#有控制台应用程序Console,也有桌面应用程序(图形界面),现在主要就是用来展示数据的。

                                                    c#有两种方式写桌面应用程序:WPF、winform。我们来看看它们有什么不同。

                                                    C#和WPF入门教程

                                                    1. winform老,wpf新;
                                                    2. winform窗体的控件属性是在C#里实现的,WPF则是在XAML里面实现的
                                                    3. winform修改控件复杂,wpf简单
                                                    4. winform入门简单,wpf入门难

                                                    宝啊,你读到此处想说什么?

                                                    什么傻逼博主,说了好像又啥都没说,都是些什么鬼啊?

                                                    我就想和你说,winform过时了,要学WPF。

                                                    1.4 .net Framework 和 .net Core联系

                                                    讲个小插曲,有一次其他部门的一个同事台上发言,原话:“我们这个程序是用 dot net core 开发的”,听到这句话时,我有点懵逼,什么人这是,你就说用C#开发的不就完了么,还tmd左一句dot net core,右一句dot net core,啥也不是。

                                                    C#和WPF入门教程

                                                    看上面这张图片,我选的都是WPF,但是它们的架构不一样。

                                                    1. .net Framework老, .net Core新
                                                    2. .net Framework只针对windows平台,但包含了Windows平台的所有特性, .net Core 支持多个平台,但没有前者全面.如果要用xp系统,则使用framework是更好的选择

                                                    顺便说一嘴:咱可不是喜欢背后说人坏话,我批评甚至是鄙视我那个说dot net core 的同事,原因是他不写任何代码,也不会写,却总是装逼,咱讨厌这样的人。

                                                    1.5 WPF各个组成部分

                                                    C#和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了。

                                                      1. 对象元素

                                                        这里的对象和面向对象编程的概念基本一致。面向对象编程的对象是对一类具有相同属性的物体进行抽象,比如有个Dog类、CAT类,这里的对象是逻辑层面上的。

                                                        xaml 中也有对象,比如按钮utton、文本框TextBox等都是对象,这里的对象是布局上的概念,更多是文法层面,不是逻辑上的概念。

                                                        在WPF中,xmal代码也称作前端代码(控件),而以.cs结尾的代码叫做 “C#代码”(也叫后端代码或者代码隐藏)。

                                                      按钮1
                                                      
                                                        
                                                      
                                                      1. 属性

                                                        在C#中(其他编程语言也一样),一个类中往往有各种属性,比如学生类中有姓名属性、年纪属性等等。在xaml中,这个概念有点类似,比如有个按钮控件(按钮类),那它也有自己的属性,比如行高、行宽、背景颜色等等。下面这个示例,Grid.Row、Grid.Column都是属性。

                                                       
                                                      1. 属性元素

                                                        属性元素是对象中的属性的属性,比如Button是一个对象,background是一个属性,对属性再设置就叫属性元素: SolidColorBrush

                                                          
                                                              
                                                          
                                                      
                                                      

                                                      2.2 xaml页面布局

                                                      2.2.1 层级概念

                                                      1. xaml设计是按照行和列的概念设计的;
                                                      2. xaml是树形结构,在使用前先对Grid进行设计(几行几列);
                                                      3. 在每个层级下面对界面进行设计

                                                        C#和WPF入门教程

                                                        可能看了上面的图片也觉得一头雾水,我们现在从网页上随便截图一张,结合WPF看看到底什么是层级结构

                                                        C#和WPF入门教程

                                                        我们把这个界面先整体分成三个区域, 即3行1列

                                                        第1行第1列 所有的图标依次用stackPanel放置控件就可以了

                                                        在第2行第1列 里面进一步切割,可在分成 2行1列

                                                        C#和WPF入门教程

                                                        在第3行第1列 里面进一步切割,可在分成 1行3列

                                                        C#和WPF入门教程

                                                        这样一个界面就被切割好了, 理解上面这个例子,应该就知道WPF层级的概念了

                                                      2.2.2 使用 Grid 定义行和列

                                                      根据上面层级的概念,将界面划分区域,接下来就可以用来实现了. 下面的代码定义2行2列的布局

                                                          
                                                              
                                                                        
                                                          
                                                          
                                                          
                                                              
                                                              
                                                          
                                                      
                                                      

                                                      我们还可以在第2行第2列里再布置2行2列,代码实现如下

                                                              
                                                                  
                                                                  
                                                              
                                                              
                                                                  
                                                                  
                                                              
                                                              
                                                                  
                                                                      
                                                                      
                                                                  
                                                                  
                                                                      
                                                                      
                                                                  
                                                              
                                                          
                                                      

                                                      C#和WPF入门教程

                                                      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#中, 只能在类内定义变量和属性,同时允许对改变量或者属性进行初始化, 但不允许一个变量直接引用另外一个变量,如下所示,这是新人经常犯的一个错误。

                                                                C#和WPF入门教程

                                                                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种:

                                                                  C#和WPF入门教程

                                                                  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


免责声明
本网站所收集的部分公开资料来源于AI生成和互联网,转载的目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复: 表情:
评论列表 (暂无评论,1209人围观)

还没有评论,来说两句吧...

目录[+]