第3-4讲:【强化】WinForm入门和企业项目标准UI设计

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] - 第3-4讲:【强化】WinForm入门和企业项目标准UI设计 - 登山亦有道
项目的结构

(1)Properties文件夹:AssemblyInfo.cs:程序集信息的配置类(通常项目正式发布后,存储项目的版本、版权、项目相关其他信息)

图片[2] - 第3-4讲:【强化】WinForm入门和企业项目标准UI设计 - 登山亦有道
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上显示的效果完全一样。

图片[3] - 第3-4讲:【强化】WinForm入门和企业项目标准UI设计 - 登山亦有道
无边框窗体展示
© 版权声明
THE END
喜欢就支持一下吧
点赞21赞赏 分享
评论 抢沙发
匿名的头像 - 登山亦有道
提交
匿名的头像 - 登山亦有道

昵称

在 WordPress 上使用 Sticker Heo 增添互动时的乐趣吧 !

取消
昵称表情代码图片

    暂无评论内容