Q1:CLR CLS CTS关系搞不清楚(CLR=CLS+CTS)
A:以上三个内容其实是不同的程序“模块”。就好比我们说的电脑的几个模块:CPU、内存、硬盘、主板。
- CLR:公共语言运行时(虚拟机)主要是用来将我们写的代码编译成微软的中间语言IL。
- CLS:在编译中,我们知道C#写的代码,和VB写的代码,在语法上是不同的。当编译成IL的时候,必须对语法进行标准化处理。
- CTS:在编译中,我们知道C#写的代码,和VB写的代码,在数据类型上是不同的,当编译成IL的时候,必须对数据类型标准化处理。
Q2:如果引用的程序集不在当前目录下,在哪里设置路径?
A2:当我们引用第三方的类库的时候,一般是复制到项目的启动目录下面。
基础语法-->做练习巩固(枯燥)-->UI设计(windows做一个快速入门)
1、项目UI设计
【1】C/S项目:首选是Winform原生控件(简单实用,但是效果不爽)(直接拖放控件)
- 第三方控件:dev.... 、免费的控件库
- WPF(界面设计上是最漂亮的....但是,你必须付出努力才行!学习成本较高)
- 自己动手设计UI:今天要讲解的,能在以上各种选择中,各方面都比较折中的方案。
- 局限性:屏幕自适应能力达不到要求。
【2】B/S项目:HTML5原生设计(CSS+DIV)太麻烦,但是性能非常高!
- jQueryUI、Extjs、EasyUI..(早期)
- BootStrap框架(响应式设计,非常流行,我们的全栈课程中,有讲解)
- LayUI框架(这个也是我们全栈课程重点讲解的,学习简单,上手快,效果又好,一般在后台应用多) ...
2、常见的项目的类型
【1】控制台程序(主要是学习使用)
【2】WinForm程序(windows程序、桌面程序、C/S程序,客户端程序…)
【3】Web程序和分布式服务程序(asp.net-webform、asp.net-mvc、webservice、webapi、wcf…)
3、不同项目部署差异
【1】WinForm程序:我们.NET开发的程序,可以直接把生成的文件拷出来就能用了。根本不需要单独的安装包,我们打包程序,仅仅是把程序模块集中到一起而已,对注册表没有任何的修改。
WinForm程序的部署方式:
- 第一、如果有数据库,数据库会在专门的服务器上。
- 第二、应用程序,在独立的客户端电脑上。(通常会有多个客户端)
- 第三、项目升级服务器。
【2】Web程序: 我们开发的程序,通常只有一个服务端,通过IIS部署到服务上,客户端其实就是浏览器。
Web程序的部署方式:
- 第一、数据库通常是独立的服务器。
- 第二、应用程序,在独立的服务器上。
4、WinForm程序设计
【1】项目的结构
(1)Properties文件夹:AssemblyInfo.cs:程序集信息的配置类(通常项目正式发布后,存储项目的版本、版权、项目相关其他信息)
(2)窗体文件Form1
包括:Form1.cs和Form1.Desinger.cs两个类,两个类的定义如下:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
partial class Form1
{
//其他内容省略…
}
结论:两个类的类名称是完全一样的!
public partial class A { }
public partial class A { }
【2】部分类(partial)
当两个类在同一个命名空间下面,类名称一样,但是使用partial关键字后,就有意思了。也就意味着这两个类看着是两个类,其实是一个类的不同部分。英语中part1 part2…目的:当一个类的内容太多的时候,我们编写和查找都容易出现不便。为了更好的管理类的代码,在VS2005的时候出现了部分类。
下面这个类里面的代码,主要是我们自己写的。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
下面是Form1.Desinger.cs文件中的代码,主要是VS自动生成的代码。
partial class Form1
{
//其他内容省略…
}
这样做的好处是可以不同的人共同编写同一个类,当然目的是更好的对代码进行分类管理。最后还能编译成一个类。建议:不要轻易添加窗体的部分类!我们开发一个建议:当我们发现这个类的内容太多的时候,请大家按照OOP原则将类的内容再次细分,封装到其他类中。
【3】常用控件
按钮控件:当我们在窗体中添加一个Button后,其实是VS自动的根据Button类帮我们创建一个按钮对象,并自动的设置了相关的属性:
private System.Windows.Forms.Button button1;
这个说明按钮是窗体对象里面的一个成员变量(对象)
当我们通过属性窗口修改完控件的属性后,后台代码会自动的修改:
//
// btnTest
//
this.btnTest.Location = new System.Drawing.Point(21, 26);
this.btnTest.Name = "btnTest";
this.btnTest.Size = new System.Drawing.Size(114, 51);
this.btnTest.TabIndex = 0;
this.btnTest.Text = "启动按钮";
this.btnTest.UseVisualStyleBackColor = true;
建议:不要随便的手动从后台修改。但是,我们如果需要动态的创建控件,我们通常会自己先添加一个控件,设置属性后
把这些代码复制到我们的相关的方法中,通过动态修改属性,来实现控件的动态控制。(后面我们讲解OOP案例的时候)
我们还发现在Form1窗体的设置中多了两个内容:
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(611, 427);
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.btnTest);
this.Name = "Form1";
this.Text = "Form1";
this.ResumeLayout(false);
就是这两句话:
this.Controls.Add(this.comboBox1);
this.Controls.Add(this.btnTest);
以上的代码说明,我们窗体本身就是一个容器
Controls的位置:Form → ContainerControl → ScrollableControl → Control
:里面的Controls集合属性
Controls集合的类型:ControlCollection → 将指定的控件添加到控件集合中。
public virtual void Add(Control value);
想理解这个Add方法,我们再看看控件Button类是怎么定义的?
public class Button : ButtonBase, IButtonControl
public abstract class ButtonBase : Control
结论:Button继承自ButtonBase,ButtonBase则继承自Control 那就说明Button是Control类的一个子类(孙类)
public virtual void Add(Control value)
这个方法中的参数定义Control是父类类型。
按照OOP多态特性:一个方法的参数如果是父类类型,那么实际传递的时候,我们要传递他的子类对象。this.Controls.Add(this.btnTest);
这个不正是我们后面讲的多态吗?
最后还要记住:窗体上所有的控件,都要添加到Controls集合中。窗体本身就是容器。如果我们在窗体中添加其他的容器,比如panel、groupbox等等,这些首先被添加到Form的Controls集合中。但是如果我们在Panel等这些容器中添加控件的时候,控件会加到它所在的第一级容器中,关于Controls我们后面会经常使用。
//
// groupBox1
//
this.groupBox1.Controls.Add(this.button1);
this.groupBox1.Location = new System.Drawing.Point(312, 87);
this.groupBox1.Name = "groupBox1";
this.groupBox1.Size = new System.Drawing.Size(200, 100);
this.groupBox1.TabIndex = 2;
this.groupBox1.TabStop = false;
this.groupBox1.Text = "groupBox1";
【4】启动窗体
static class Program
{
/// /// 应用程序的主入口点。 ///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
在这里是程序的入口,我们发现 Application.Run(new Form1());
这句话告诉我们Form1窗体是作为项目的启动窗体,启动窗体就意味着项目的主线程运行,当我们关闭Form1窗体的时候,整个项目会退出的。我们可以根据需要修改这个启动窗体。如有一个登陆窗体(FrmAdminLogin)需要首先运行我们就可以将其修改为FrmAdminLogin
【5】无边框窗体设计
思想:我在Iphone5出现的时候,里面的图标都实现了扁平化设计。后面很多手机都跟风。并且流行。
思考:PC端能否这样呢?
当然没问题!
方法:
第一、窗体边框去掉。然后自己设计“边框”和颜色。
第二、窗体大小,必须提前设计好。
第三、控件要扁平化处理,扁平化的好处:不管你是在win7、win8、win10上显示的效果完全一样。
作者:晨岩
本站所有文章除特别声明外,均采用 BY-NC-SA 4.0 许可协议。转载请注明出处!
暂无评论内容