精华内容
下载资源
问答
  • windows窗体设计

    2014-05-27 16:22:17
    [img=https://img-bbs.csdn.net/upload/201405/27/1401178824_50023.png][/img] 左边是设计,右边是运行 listview为什么运行之后里面的字都变大了,怎么回事?
  • visual studio 窗体 设计
  • Windows 窗体设计器中的设计时错误     在用 VS.NET进行窗体设计的时候,经常会遇到这样的问题:我们需要在构造函数或者在OnLoad事件中进行自己的一些初始化操作,比如连接一个数据库...

    Windows 窗体设计器中的设计时错误

    image

    image

     

     

    在用 VS.NET进行窗体设计的时候,经常会遇到这样的问题:我们需要在构造函数或者在OnLoad事件中进行自己的一些初始化操作,比如连接一个数据库、调用一个资源文件或者后期绑定一个组件。如果代码通过编译,在运行时会执行得相当如你所愿。然而,当我们用窗体设计器打开这样一个窗体或者继承的窗体,IDE环境会抛出非常令人不愉快的异常,比如(NullReferenceException )。
     
    究其原因,主要是窗体设计器在载入窗体时会自动初始化该对象,自动执行诸如构造函数、OnLoad方法和InitializeComponent方法,目的在于能使窗体设计器展现出可视化的编辑操作环境。(一些第三方控件也就是利用这个时机弹出注册认证的)。
    现在大家明白了,原来我们通过窗体设计器打开一个窗体类或控件类时,IDE环境已经悄悄地在宿主进程中实例化了我们的类。
    如果我们在构造函数中写了这样的代码:
    1. public class MyClass : System.WIndows.Forms.Form  
    2. {  
    3. public MyClass(string fileName)  
    4. {   
    5. InitializeComponent();  
    6. FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常!  
    7. //…  
    8.          }  
    9.   
    10.          //…  
    11. }  
    public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! //… } //… }
    问题便由此产生,fileName参数的值是程序在运行时传递的,设计时当然无从获得。所以,窗体设计器在打开此窗体类时,必然会抛出异常,同时窗体将无法正常显示。
    解决这种问题的办法网上其他朋友说了很多,归纳起来好像主要有以下三种途径:
    一、判断 this.DesignMode 属性
    这是让人一眼看过去就觉得最直接最有效的方法,绝对有一种踏破铁蹄无觅处,得来全不费功夫的欣快感——可惜的是,用起来一点不奏效。因为如果该窗体是个独立窗体或控件,那一点问题都没有,DesignMode的值如你所愿为true,但是如果它是包含在其他控件中被拖拽到设计器中(例如,把设计好的控件拖入新的WinForms窗体),那么那个接受拖拽的窗体才处于设计模式,而它不是,它已鬼使神差地进入了RunTime模式,然后如我所愿,抛出异常J
     
    二、利用 Assembly.GetEntryAssembly()方法
    判断执行程序入口的组件是不是我们预想的,如果不是,那么必然是IDE的窗体设计器调用的——问题解决——只是有点大炮打蚊子的感觉。
     
    三、定义一个静态成员,指示程序所处的模式
    此方法我认为最好。具体做法是写一个全局类,也就是构造函数为 private 限制的类,里面的成员都为static静态类型。这样的一个类由于构造函数是私有的,所以不可能自任何地方任何外部代码中实例化,从而保证了其内成员的唯一性。然后,在程序的入口处,把此类的一个用于表示运行模式的静态成员标识为“运行时”,下面….一切都好说了,看代码吧: 
    1. //全局类  
    2. public class GlobalClass  
    3. {  
    4. //私有构造器,防止实例化  
    5. private GlobalClass(){}  
    6. //用于标识运行时/设计时的bool型静态成员,初始值设为false  
    7. public static bool RunTimeMode = false;  
    8. }  
    9.    
    10. //包含程序入口的类  
    11. Public class Entry  
    12. {  
    13. …  
    14. //主线程入口点,窗体设计器绝不会执行此方法  
    15. static void Main(string[] args)  
    16. {  
    17.          //置为true  
    18. GlobalClass.RunTimeMode = true;  
    19. //…..  
    20.          }  
    21.          //…  
    22. }  
    23.    
    24. //某个窗体类  
    25. public class MyForm : System.Windows.Forms.Form  
    26. {  
    27.          public MyForm()  
    28.          {  
    29.                    //窗体设计器必须调用的  
    30.                    InitializeComponent();  
    31.                    //判断运行模式  
    32.                    If( GlobalClass.RunTimeMode )  
    33.                    {  
    34.                             //在此处做一些窗体设计器会报错的事情  
    35.                    }  
    36.                    //…  
    37.          }  
    38.          //…  
    39. }  
    //全局类 public class GlobalClass { //私有构造器,防止实例化 private GlobalClass(){} //用于标识运行时/设计时的bool型静态成员,初始值设为false public static bool RunTimeMode = false; } //包含程序入口的类 Public class Entry { … //主线程入口点,窗体设计器绝不会执行此方法 static void Main(string[] args) { //置为true GlobalClass.RunTimeMode = true; //….. } //… } //某个窗体类 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗体设计器必须调用的 InitializeComponent(); //判断运行模式 If( GlobalClass.RunTimeMode ) { //在此处做一些窗体设计器会报错的事情 } //… } //… } 呵呵,问题圆满解决。其实这样一个全局类在我们平时设计系统的时候会经常用到,多用于存储一些对象间的交互数据或者运行时环境参数。
    如果大家有什么更好的办法解决所述问题,记得分享哦 :)

     

    print?

    1. public class MyClass : System.WIndows.Forms.Form 
    2. public MyClass(string fileName) 
    3. {  
    4. InitializeComponent(); 
    5. FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! 
    6. //… 
    7.          } 
    8.  
    9.          //… 

    public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! //… } //… }

    问题便由此产生,fileName参数的值是程序在运行时传递的,设计时当然无从获得。所以,窗体设计器在打开此窗体类时,必然会抛出异常,同时窗体将无法正常显示。
    解决这种问题的办法网上其他朋友说了很多,归纳起来好像主要有以下三种途径:
    一、判断 this.DesignMode 属性
    这是让人一眼看过去就觉得最直接最有效的方法,绝对有一种踏破铁蹄无觅处,得来全不费功夫的欣快感——可惜的是,用起来一点不奏效。因为如果该窗体是个独立窗体或控件,那一点问题都没有,DesignMode的值如你所愿为true,但是如果它是包含在其他控件中被拖拽到设计器中(例如,把设计好的控件拖入新的WinForms窗体),那么那个接受拖拽的窗体才处于设计模式,而它不是,它已鬼使神差地进入了RunTime模式,然后如我所愿,抛出异常J
     
    二、利用 Assembly.GetEntryAssembly()方法
    判断执行程序入口的组件是不是我们预想的,如果不是,那么必然是IDE的窗体设计器调用的——问题解决——只是有点大炮打蚊子的感觉。
     
    三、定义一个静态成员,指示程序所处的模式
    此方法我认为最好。具体做法是写一个全局类,也就是构造函数为 private 限制的类,里面的成员都为static静态类型。这样的一个类由于构造函数是私有的,所以不可能自任何地方任何外部代码中实例化,从而保证了其内成员的唯一性。然后,在程序的入口处,把此类的一个用于表示运行模式的静态成员标识为“运行时”,下面….一切都好说了,看代码吧: 
    1. //全局类 
    2. public class GlobalClass 
    3. //私有构造器,防止实例化 
    4. private GlobalClass(){} 
    5. //用于标识运行时/设计时的bool型静态成员,初始值设为false 
    6. public static bool RunTimeMode = false
    7.   
    8. //包含程序入口的类 
    9. Public class Entry 
    10. … 
    11. //主线程入口点,窗体设计器绝不会执行此方法 
    12. static void Main(string[] args) 
    13.          //置为true 
    14. GlobalClass.RunTimeMode = true
    15. //….. 
    16.          } 
    17.          //… 
    18.   
    19. //某个窗体类 
    20. public class MyForm : System.Windows.Forms.Form 
    21.          public MyForm() 
    22.          { 
    23.                    //窗体设计器必须调用的 
    24.                    InitializeComponent(); 
    25.                    //判断运行模式 
    26.                    If( GlobalClass.RunTimeMode ) 
    27.                    { 
    28.                             //在此处做一些窗体设计器会报错的事情 
    29.                    } 
    30.                    //… 
    31.          } 
    32.          //… 
    //全局类 public class GlobalClass { //私有构造器,防止实例化 private GlobalClass(){} //用于标识运行时/设计时的bool型静态成员,初始值设为false public static bool RunTimeMode = false; } //包含程序入口的类 Public class Entry { … //主线程入口点,窗体设计器绝不会执行此方法 static void Main(string[] args) { //置为true GlobalClass.RunTimeMode = true; //….. } //… } //某个窗体类 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗体设计器必须调用的 InitializeComponent(); //判断运行模式 If( GlobalClass.RunTimeMode ) { //在此处做一些窗体设计器会报错的事情 } //… } //… } 呵呵,问题圆满解决。其实这样一个全局类在我们平时设计系统的时候会经常用到,多用于存储一些对象间的交互数据或者运行时环境参数。
    如果大家有什么更好的办法解决所述问题,记得分享哦

     

    print?

    1. public class MyClass : System.WIndows.Forms.Form 
    2. public MyClass(string fileName) 
    3. {  
    4. InitializeComponent(); 
    5. FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! 
    6. //… 
    7.          } 
    8.  
    9.          //… 

    public class MyClass : System.WIndows.Forms.Form { public MyClass(string fileName) { InitializeComponent(); FileStream myFile = File.Open( filename ); // 窗体设计器可能抛出异常! //… } //… }

    问题便由此产生,fileName参数的值是程序在运行时传递的,设计时当然无从获得。所以,窗体设计器在打开此窗体类时,必然会抛出异常,同时窗体将无法正常显示。
    解决这种问题的办法网上其他朋友说了很多,归纳起来好像主要有以下三种途径:
    一、判断 this.DesignMode 属性
    这是让人一眼看过去就觉得最直接最有效的方法,绝对有一种踏破铁蹄无觅处,得来全不费功夫的欣快感——可惜的是,用起来一点不奏效。因为如果该窗体是个独立窗体或控件,那一点问题都没有,DesignMode的值如你所愿为true,但是如果它是包含在其他控件中被拖拽到设计器中(例如,把设计好的控件拖入新的WinForms窗体),那么那个接受拖拽的窗体才处于设计模式,而它不是,它已鬼使神差地进入了RunTime模式,然后如我所愿,抛出异常J
     
    二、利用 Assembly.GetEntryAssembly()方法
    判断执行程序入口的组件是不是我们预想的,如果不是,那么必然是IDE的窗体设计器调用的——问题解决——只是有点大炮打蚊子的感觉。
     
    三、定义一个静态成员,指示程序所处的模式
    此方法我认为最好。具体做法是写一个全局类,也就是构造函数为 private 限制的类,里面的成员都为static静态类型。这样的一个类由于构造函数是私有的,所以不可能自任何地方任何外部代码中实例化,从而保证了其内成员的唯一性。然后,在程序的入口处,把此类的一个用于表示运行模式的静态成员标识为“运行时”,下面….一切都好说了,看代码吧: 
    1. //全局类 
    2. public class GlobalClass 
    3. //私有构造器,防止实例化 
    4. private GlobalClass(){} 
    5. //用于标识运行时/设计时的bool型静态成员,初始值设为false 
    6. public static bool RunTimeMode = false
    7.   
    8. //包含程序入口的类 
    9. Public class Entry 
    10. … 
    11. //主线程入口点,窗体设计器绝不会执行此方法 
    12. static void Main(string[] args) 
    13.          //置为true 
    14. GlobalClass.RunTimeMode = true
    15. //….. 
    16.          } 
    17.          //… 
    18.   
    19. //某个窗体类 
    20. public class MyForm : System.Windows.Forms.Form 
    21.          public MyForm() 
    22.          { 
    23.                    //窗体设计器必须调用的 
    24.                    InitializeComponent(); 
    25.                    //判断运行模式 
    26.                    If( GlobalClass.RunTimeMode ) 
    27.                    { 
    28.                             //在此处做一些窗体设计器会报错的事情 
    29.                    } 
    30.                    //… 
    31.          } 
    32.          //… 
    //全局类 public class GlobalClass { //私有构造器,防止实例化 private GlobalClass(){} //用于标识运行时/设计时的bool型静态成员,初始值设为false public static bool RunTimeMode = false; } //包含程序入口的类 Public class Entry { … //主线程入口点,窗体设计器绝不会执行此方法 static void Main(string[] args) { //置为true GlobalClass.RunTimeMode = true; //….. } //… } //某个窗体类 public class MyForm : System.Windows.Forms.Form { public MyForm() { //窗体设计器必须调用的 InitializeComponent(); //判断运行模式 If( GlobalClass.RunTimeMode ) { //在此处做一些窗体设计器会报错的事情 } //… } //… } 呵呵,问题圆满解决。其实这样一个全局类在我们平时设计系统的时候会经常用到,多用于存储一些对象间的交互数据或者运行时环境参数。
    如果大家有什么更好的办法解决所述问题,记得分享哦 :)

    print?

    posted @ 2017-03-10 17:16 李华丽 阅读(...) 评论(...) 编辑 收藏
    展开全文
  • Windows窗体设计概念及原则 本节介绍一下Windows窗体设计中的一些概念和原则。 控件的名称 当开发人员在窗体中新增一个控件时,系统会给这个控件设置默认名称,比如对于Label控件,其默认名称可能为lable1、...
    Windows窗体设计概念及原则
        本节介绍一下Windows窗体设计中的一些概念和原则。
    控件的名称
        当开发人员在窗体中新增一个控件时,系统会给这个控件设置默认名称,比如对于Label控件,其默认名称可能为lable1、label2等,对于TextBox控件其默认名称可能为textBox1、textBox2等等。
        如下图所示,笔者设计了一个“用户信息”窗体,在默认情况下,各个控件的名称如下图所示。
     

        这是一种非常糟糕的窗体设计结果。在编写该窗体的C#代码时,由于无法同时看到窗体设计界面,因此很难记下各种控件的名称及其功能。当窗体控件比较多时,此时的程序代码的编写和维护时相当困难的。
        因此开发人员应当养成在窗体上新建控件就立即修改控件名称的习惯。这样能有效的改进软件的用户界面的设计质量,也是窗体后台代码高质量的基础。对于Label控件,由于基本上不参与编程,只是在用户界面上显示一段不可改变的静态文本,因此可以不设置Label控件的名称,但当在少数情况下,当窗体后台代码需要操作Label控件的文本等属性值时,为了提高代码的质量也应当修改Label控件的名称。比如对于下面这个窗体,各个数据输入控件的名称设置如下。
     

        跟代码变量命名规则类型,窗体控件也有命名规则,业界主流的控件命名规则可能有多种,各种规则之间差别不大,笔者采用的命名规则大致如下[袁永福版权所有]
        控件名称一般为表示控件类型的前缀加上表示控件作用的字符组成。常用控件类型和前缀对应关系如下表所示
    控件类型
    前缀
    Button 按钮
    btn
    CheckBox 复选框
    chk
    ColumnHeader 视图列表头
    col
    ComboBox 组合框
    cbo
    ContextMenu 快捷菜单
    ctm
    DataGrid 数据网格控件
    dg
    DataGridView 数据网格视图控件
    dgv
    DateTimePicker 时间输入框
    dtp
    DomainUpDown 数值框
    dud
    Form 窗体
    frm
    GroupBox 组合框
    grp
    HscrollBar 水平滚动条
    hsb
    ImageList 图标列表
    img
    Label 文本标签
    lbl
    LinkLabel 带链接的文本标签
    lbl
    ListBox 列表框
    lst
    ListView 视图列表
    lvw
    Menu 菜单
    menu
    MenuItem 菜单项
    menu
    NumericUpDown 数值框
    nud
    Panel 面板
    pnl
    PictureBox 图片框
    pic
    ProgressBar 进度条
    prg
    RadioButton 单选框按钮
    rdo
    Spliter 拆分条
    spl
    StatusBar 状态栏
    stu
    StatusBarPanel 状态栏区域
    pnl
    StatusStrip 状态栏
    stu
    TabControl 分页控件
    tab
    TabPage 分页标签页面
    page
    TextBox 文本框
    txt
    Timer 定时器
    tmr
    ToolBar 工具条
    tbr
    ToolStrip 工具栏
    tsp
    ToolStripButton 工具栏按钮
    btn
    ToolStripComboBox 工具栏下拉组合框
    cbo
    ToolStripDropDownButton 工具栏下拉列表
    btn
    ToolStripDropDownMenu 工具栏菜单项目
    menu
    ToolStripLabel 工具栏静态文本
    lbl
    ToolStripProgressBar 工具栏进度条
    prg
    ToolStripTextBox 工具栏文本框
    txt
    TreeView 树状视图列表
    tvw
    VScrollBar 垂直滚动条
    vsb
    WebBrowser 浏览器控件
    wb
        对于其他非常用的控件类型的前缀读者可以自己琢磨或者请教他人,控件名称前缀只是一个比较小的细节问题,即使有误也无伤大雅。[袁永福版权所有]
        笔者一般使用英文或者缩写来表示控件的作用,若没有合适的英文则采用汉语全拼音或者干脆用中文汉字,但绝不会用中文汉语拼音首字母,因为汉语拼音首字母很难仅仅从字母上猜出其表示的汉字,而猜测英文缩写相对容易得多。
        如下图所示,可能有些人使用汉语拼音首字母来设置控件的名称,比如“姓名”文本框取名“txtXM”,这是一种不好的控件命名方式,因为很多时候是实在是难于从拼音首字母中猜测控件的作用,控件名称的低可读性降低了程序代码的可读性。
     

        因此按照比较合理的命名方式,“姓名”文本框的名称就采用TextBox控件的前缀“txt”和表示姓名的英文“Name”组合而成为“txtName”。
        一般来说商业软件不是“一次开发,长期使用”,而是“一次开发,长期修改,长期使用”,因此开发商业软件需要考虑到未来的修改和升级换代,此时程序代码不但要耐用,还需要耐看耐改,程序代码需要具备良好的可读性,而给控件设置合适的名称就是一个基础工作。其实除了控件的名称,其他的诸如数据库表名字段名,窗体名称,程序模块名称等等都需要遵守一定的命名规范。[袁永福版权所有]
    TabIndex属性
        首先的设置好控件的TabIndex属性值。在程序运行显示窗体时,用户可以按下Tab键来切换输入焦点,而切换顺序就依照各个控件的TabIndex属性。一般的输入焦点切换顺序按照从左到右,从上到下。因此需要设置左上方位的控件的TabIndex属性值为小,右下方为的控件的TabIndex属性值为大。但实际开发中还是按照具体功能需求来安排输入焦点切换顺序。
        在设置各个控件的TabIndex属性值时不应设置为连续的值,比如设置第一个控件的TabIndex属性值为1,第二个控件为2,第三个控件为3,等等等。采用这种设置时,当未来在输入焦点顺序中插入新的控件,则会需要修改大量的控件的TabIndex属性值。为此笔者建议输入的各个控件的TabIndex属性值不联系,比如有10的间隔,此时可以设置第一个控件的TabIndex属性值为10,第二个控件为20,第三个控件为30,等等等。这样就为未来插入新的控件留下TabIndex顺序的空间。如下图所示
     

        在这个“用户信息”窗体设计的例[袁永福版权所有]子中,当该窗体运行显示后,用户可以按下Tab键从左到右从上到下的切换焦点。
        有些控件并不能接受输入焦点,比如Label控件,但仍然需要为这类控件设置合适的TabIndex属性值。因为Label控件虽然不能接受输入焦点,但仍然能接受快捷键,比如在“用户信息”的窗体设计中,笔者设置第一个Label控件的文本为“姓名 (&N):”,则程序运行后显示该窗体时,用户按下“Alt+N”组合键时,Label控件就感应到快捷键并试图设置输入焦点到自己,由于Label控件不能接受输入焦点,因此系统就会将输入焦点自动切换到Label控件的下一个焦点顺序的控件上。也就是TabIndex值为20的文本框上。这样用户就使用快捷键“Alt+U”就能快速切换焦点到“姓名”文本框了。
        当用户界面上数据输入域很多时,这种快速切换输入焦点的功能是很人性化的,方便用户使用纯键盘操作来高速输入和修改数据,显得用户界面做的很专业。若没有这种功能,则用户需要频繁的切换鼠标和键盘来输入数据,大大拖累的操作速度。
        商业程序的用户界面要求比较高,因为使用者可能好几年天天面对相同的用户界面,累计下来会重复进行几万次操作,此时用户界面需要耐看耐用,这需要在很多细节上做好功夫,其中设置各[袁永福版权所有]个控件的TabIndex属性值就是一个基础工作,必须花点心思做好。
    Z-Index
        在WinForm窗体设计中有一个Z-Index的概念。窗体布局是采用绝对坐标方式的,每一个控件都有Left和Right属性用于确定控件的左上角在窗体中的X-Y坐标。
        当窗体有多个控件时,控件之间可能存在相互重叠的现象,这类似图像处理中层的概念。也就是说一个控件单独的占有一个控件布局层,多个控件就会有多个布局层的叠加,而越靠近窗体的控件就越容易被覆盖,于是从窗体开始计算,每个控件布局层都有一个从0开始计算的序号,这个序号就是Z-Index。
        从另外一种方式理解,窗体上的控件布局是不仅仅是X-Y坐标系那种二维的,而是三维的,第三维就是Z坐标轴,它是从窗体向用户延伸的,控件是分布在窗体和用户之间。此时可以说用户是俯看用户界面,若不注意是不会感觉到第三维的存在。而且控件在第三维中的坐标值就是Z-Index,这个值是从0开始的,不会重复;Z-Index值大的控件可以覆盖掉值小的控件。
        我们还可以从第三种方式看Z-Index值,窗体对象有一个Controls的属性,该属性值可以看做一个控件数组,窗体上所有的控件都在这个数组中。系统创建窗体时,是从这个数组逆向遍历获得控件对象,然后依次放置在窗体上,很显然在数组中靠前的控件可以覆盖掉靠后的控件,于是控件在这个数组中的逆向序号也可以看做Z-Index值。
     
        实际上其他软件开发技术中也有Z-Index属性,比如VB,还有Web开发中才CSS样式也支持Z-Index属性值。
        Z-Index与其他控件相关,因此控件本身不会有Z-Index属性,而且根据控件在窗体中的布局动态的计算出来的。
        在VS.NET的窗体设计器中,不能直接设置控件的Z-Index值,但可以使用布局工具条上的“置于顶层”和“置于低层”按钮来将控件沿着Z坐标轴置于最大值或最小值,也就是沿着Z坐标轴移动控件,使其最靠近用户或者最靠近窗体。
        在窗体设计中,设置控件在Z轴上的先后顺序也是有一些原则的,那就是重要的控件需要置前,不能被不重要的控件覆盖掉。如下图所示
     

        文本标签的Z-Index值大于文本框的,这种用户界面是很不好的,会遮挡文本框中的部分类型,而且也不美观,因此需要调整为文本框靠前,也就是如下图的效果。
     

        如果用户界面排版时被迫发生一些重叠遮盖,也必须保证重要的控件不被遮盖。
    一般来说,若设计人员心中已经知道用户界面的设计,在窗体上从左到右、从上到下的依次添加控件,控件的TabIndex和Z-Index值都是不断增加的,此时做好之后大多就无需调整了。但在实际中设计好的窗体经常会添加或删除控件,或者大幅移动控件的位置,此时需要注意调整控件的TabIndex和Z-Index值。[袁永福版权所有]
     
    统一的控件对齐方式
        在同一个软件中,甚至同一家企业开发的所有的软件中,对于窗体控件纵向应当采用相同的对齐方式,可以左对齐、居中对齐或者右对齐。不过笔者建议左对齐。
    如下图所示,对于“用户信息”窗体,控件设计时采用左对齐时窗体的运行时用户界面如下
     

        而采用居中对齐时窗体运行时的用户界面如下
     

        采用右对齐时窗体运行时的用户界面如下
     

        对比这三种情况,应该是控件左对齐排版最好,其次是右对齐,居中对齐最差。因此一般都是采用左对齐方式。
        不过不管采用哪种控件对齐方式,一定要记住在同一个软件中所有的用户界面中采用统一的对齐方式,不能一个窗体采用左对齐而另外一个窗体采用右对齐,这是一种相当不专业的表现。
        在VS.NET中统一控件的对齐方式是比较简单的,首先将控件按照大致的位置布局好,然后选中所有要参与对齐操作的控件,点击工具条上的对齐功能按钮就可。
        下图就是VS.NET提供的对齐工具条。
     

    该工具条上常用的按钮功能有

     左对齐

    移动控件,使得所有控件的左边缘对齐。

     居中对齐

    移动控件,使得所有的控件的垂直中轴线重合。

     右对齐

    移动控件,使得所有控件的右边缘对齐。

     顶端对齐

    移动控件,使得所有控件的顶边缘对齐。

     中间对齐

    移动控件,使得所有控件的水平中轴线重合。

     底端对齐

    移动控件,使得所有控件的底边缘对齐。

     使宽度相同

    设置所有控件的宽度值等于当前控件的值。

     使高度相同

    设置所有控件的高度值等于当前控件的值。

     使大小相同

    设置所有控件的宽度和高度等于当前控件的值。

     使水平间距相等

    适当的水平移动控件,使得各个控件水平方向的间距相等。

     增加水平间距

    适当的水平移动控件,使得各个控件水平方向的间距增加一些,各个控件的间距增加量相同。

     减小水平间距

    适当的水平移动控件,使得各个控件水平方向的间距减少一些,各个控件的间距减少量相同。

     移除水平间距

    适当的水平移动控件,使得各个控件水平方面紧密的靠在一起,之间没有间隙。

     使垂直间距相等

    适当的上下移动控件,使得各个控件垂直方向的间距相等。

     增加垂直间距

    适当的上下移动控件,使得各个控件垂直方向的间距增加一些。

     减小垂直间距

    适当的上下移动控件,使得各个控件垂直方向的间距减小一些。

     移除垂直间距

    适当的上下移动控件,使得各个控件垂直方向紧密的靠在一起,之间没有间隙。

     置于顶层

    使得控件在Z顺序方向变得靠前,不被其他控件遮盖。

     置于底层

    使得控件在Z顺序方向变得靠后,不会覆盖其他控件。
        例如有几个控件的位置设计如下
     

        此时需要选中这些控件,然后点击对齐工具条上的“ 中间对齐”和“ 移除水平间距”按钮即可达到如下图所示的设计效果。
     

     

    转载于:https://www.cnblogs.com/shenjianxi/archive/2012/10/20/2732571.html

    展开全文
  • 4.4 Windows窗体设计 一个程序可能包含多个窗体,从对这些窗体的管理来看,C#程序设计通常可分为 基于单文档界面的应用程序 和 基于多文档的应用程序 两种。 4.4.1 基于单文档的窗体设计 基于单文档界面...

     

    4.4 Windows窗体设计

    一个程序可能包含多个窗体,从对这些窗体的管理来看,C#程序设计通常可分为 基于单文档界面的应用程序基于多文档的应用程序 两种。

     

    4.4.1 基于单文档的窗体设计

    基于单文档界面(Single Document Interface,SDI)应用程序中由单个文档或窗体,或多个独立的的窗体组成。单文档应用程序中每次只能处理一个当前激活的文档,如Windows操作系统中的画图工具和文本文档。

     

     

     

    4.4 Windows窗体设计

    一个程序可能包含多个窗体,从对这些窗体的管理来看,C#程序设计通常可分为 基于单文档界面的应用程序基于多文档的应用程序 两种。

     

    4.4.1 基于单文档的窗体设计

    基于单文档界面(Single Document Interface,SDI)应用程序中由单个文档或窗体,或多个独立的的窗体组成。单文档应用程序中每次只能处理一个当前激活的文档,如Windows操作系统中的画图工具和文本文档。

     

    4.4.2 基于多文档的窗体设计

    基于多文档界面(Multiple Document Interface,MDI)应用程序中包含多个文档或窗体所有文档都被组织到一个公共界面下。多文档的应用程序窗体通常分为父窗体子窗体两种,包含其他窗体的窗体称为父窗体,只能被包含的窗体则称为子窗体。多文档应用程序可以同时打开多个子窗体,但只能有一个窗体处于激活状态,如Microsoft Excel。

    代码实例

    需求:MDI应用程序

    设计:

    (1)启动VS,在Controls中新建3个窗体Form11、Form12、Form13。其中,Form11为父窗体;Form12和Form13为子窗体。

    (2)为Form11添加1个MenuStrip控件到窗体设计区。

    (3)设置3个窗体和控件的相关属性

    窗体和控件

    属性

    属性值

    Form11

    Text

    MDI应用

    MenuStrip1:Items

    Name

    formToolStripMenuItem

    Text

    窗体

    formToolStripMenuItem1:DropDownItems

    Name

    form1ToolStripMenuItem

    Text

    子窗体1

    formToolStripMenuItem1:DropDownItems

    Name

    form2ToolStripMenuItem

    Text

    子窗体2

    Form12

    Text

    子窗体1

    Form13

    Text

    子窗体2

    (4)设置Form11为MDI项目的父窗体。其中将IsMdiContainer属性(确定该窗体是否为MDI容器)设置为True,WindowState属性(确定窗体的初始可视状体)设置为Maxmized。

    (5)为Form11(父窗体)编写代码。定义两个属性FormShow1和FormShow2,分别用来标记子窗体1和子窗体2是否已经被打开。当单击“子窗体1”菜单时,打开且只能打开一次子窗体1,当单击“子窗体2”时,打开且只能打开一次子窗体2。

    (6)为Form12(子窗体1)的FormClosing事件编写处理程序。

    (7)为Form13(子窗体2)的FormClosing事件编写处理程序。

    (8)在解决方案资源管理器Controls项目中双击Program.cs文件,修改Main()方法。

     

    MenuStrip1:Items:Gets all the items that belong to a ToolStrip. (Inherited from ToolStrip)

    formToolStripMenuItem1:DropDownItems :

    Gets the collection of items in the ToolStripDropDown that is associated with this ToolStripDropDownItem. (Inherited from ToolStripDropDownItem)

     

    ToolStrip Class :Provides a container for Windows toolbar objects.

    继承

    ObjectMarshalByRefObjectComponentControlScrollableControlToolStrip

    派生 BindingNavigator  MenuStrip  StatusStrip  ToolStripDropDown

    属性ComVisibleAttribute  ClassInterfaceAttribute

    实现IComponent  IDisposable

    运行结果和代码:

     

       static void Main()

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new Form11());

            }

       static void Main()

            {

                Application.EnableVisualStyles();

                Application.SetCompatibleTextRenderingDefault(false);

                Application.Run(new Form11());

            }

    展开全文
  • 3.在已经安装的模板中选择编程语言为visualC#,选择其中的windows经典桌面中的Windows窗体应用(用来创建具有Windows窗体用户界面的应用程序),项目名为“MyFirstForm”。4.在我们创建好项目后,解决方案中包含了...

    dc2d5ccf94887cd5a0e3183b8b697dc4.png
    1. 步骤:
    2. 打开visual studio2013开发软中,在菜单栏中选择“文件”命令,可以看到“新建”、“项目”选择。

    23e9125900b41c83e2d81f30ce2dcaec.png

    3.在已经安装的模板中选择编程语言为visualC#,选择其中的windows经典桌面中的Windows窗体应用(用来创建具有Windows窗体用户界面的应用程序),项目名为“MyFirstForm”。

    ab43a3a44ed082349ceac417479cbde6.png

    4.在我们创建好项目后,解决方案中包含了Form1.cs文件。这个就是窗体应用程序项目给我设计好的窗体。

    08ba595cb17b4b98896391372ce26dbc.png

    5.鼠标定位到“Form1.cs”这个文件中,双击进入窗体设计界面。在窗体上右键属性打开属性页面,就可以在上面

    ccf37ae317c46733f5dc59690ba109a1.png

    6.在Form窗口中,右键“查看代码”进入编写代码界面,可以在这个文件下编写所需要的代码

    ccf37ae317c46733f5dc59690ba109a1.png

    7.在Form1.cs文件下有个“Form1.Designer.cs”文件,这是系统给我们定义好的资源文件

    928a7902c9bdee0cde89a3eeeb425521.png

    8.进入form1窗体中,拖一个按钮,设置text属性为“我的第一个程序”,添加一个click事件。

    53a90fb8446b4b8918c765f156ac1a52.png

    9.进入click 事件方法,添加一个MessageBox.Show("Hello World");用来显示一个对话框。具体代码如下:

    0063d37508ac8df0231a747db6e5f639.png

    10.编译运行程序,点击窗体上的按钮“这是我的第一个程序”。后面弹出一个对话框显示“Hello World”。

    eed6055b79f3d036ab97a40480206373.png

    二、我的窗体——计算器

    //考虑输入的内容为:字符串

    //考虑是否为空,是否去空格

    //考虑是否符合要求的数字

    //考虑谁获得焦点,谁清空

    把textbox内容清空:

     this.texNum01.Clear();

    获得焦点:

     this.texNum01.Focus();

    碰到异常的情况:

    停止代码往下执行:return;

     public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void but_cal_Click(object sender, EventArgs e)
            {
                //输入2个介于0-1000的正整数,计算它们的和,输出结果
                string str01 = this.texNum01.Text.Trim();
                //考虑是否为空,是否介于0-1000之间
                if(str01.Length==0){
                    //提示没有输入有效字符!
                    //不往下执行
                    //获得焦点,继续输入
                    MessageBox.Show(lab_num01.Text+"没有输入有效字符!","",MessageBoxButtons.OK,MessageBoxIcon.Information);
                    this.texNum01.Clear();
                    this.texNum01.Focus();
                    return;
    
                }
                int num01=Convert.ToInt32(str01);
                if(num01<0||num01>1000){
                    MessageBox.Show(lab_num01.Text+"数字必须介于0-1000之间!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                   
                    this.texNum01.Focus();
                    return;
                }
    
                 string str02 = this.texNum02.Text.Trim();
                //考虑是否为空,是否介于0-1000之间
                if(str02.Length==0){
                    //提示没有输入有效字符!
                    //不往下执行
                    //获得焦点,继续输入
                    MessageBox.Show(lab_num02.Text+"没有输入有效字符!","",MessageBoxButtons.OK,MessageBoxIcon.Information);
                    this.texNum02.Clear();
                    this.texNum02.Focus();
                    return;
    
                }
                int num02=Convert.ToInt32(str02);
                if(num02<0||num02>1000){
                    MessageBox.Show(lab_num02.Text+"数字必须介于0-1000之间!", "", MessageBoxButtons.OK, MessageBoxIcon.Information);
                    this.texNum02.Focus();
                    return;
                }
    
                texResult.Text = (num01 + num02).ToString();
            }
            
    展开全文
  • Windows 窗体设计器提供多个用于生成 Windows 窗体应用程序的工具。 本演练阐释如何使用设计器提供的各种工具生成应用程序。 本演练涉及以下任务: 创建一个 Windows 窗体项目。 使用对齐线排列控件。 ...
  • 支持使用基于Windows窗体应用程序的.NET Core 3.0(预览)的Windows窗体设计器 介绍 截至撰写本文时,Microsoft和社区目前正在测试.NET Core 3.0。如果您在.NET Core 3.0的一般可用性之后阅读本文,请跳过本文。...
  • 本文由微信公众号《开发者精选资讯》翻译首发,转载请注明来源今天我们很高兴地宣布,.NET Core项目的Windows窗体设计器现在可以在 Visual Studio 2019 16.6 版中作为预览使用!我们在Visual Studio 16.7 预览版1中...
  • 本文由微信公众号《开发者精选资讯》翻译首发,转载请注明来源今天我们很高兴地宣布,.NET Core 项目的 Windows 窗体设计器现在可以在 Visual Studio 2019 1...
  • C#程序设计任务实训报告 本文描述的是基于Windows环境的学生信息管理系统主 要功能模块包括学生信查询学生信息管理学生成绩录入, 学生信息管理,主要工具Microsoft Visual Studio 2008 设计 窗体, Access建立数据库,...
  • 本文由微信公众号《开发者精选资讯》翻译首发,转载请注明来源今天我们很高兴地宣布,.NET Core项目的Windows窗体设计器现在可以在 Visual Studio 2019 16.6 版中作为预览使用!我们在Visual Studio 16.7 预览版1中...
  • 本文由微信公众号《开发者精选资讯》翻译首发,转载请注明来源今天我们很高兴地宣布,.NET Core项目的Windows窗体设计器现在可以在 Visual Studio 2019 16.6 版中作为预览使用!我们在Visual Studio 16.7 预览版1中...
  • ASP.NET(一)——Windows窗体设计

    千次阅读 2013-05-17 22:32:42
    C/S结构即大家熟悉的客户端服务器结构。前边我们学习的都是C/S的开发阶段,...这里先从.NET平台的Windows窗体设计,即C/S开发方面简单介绍一下。  由于前边我们学习VB 6.0,VB.NET并相继开发了,学生管理系统,机房收
  • 给你一个基本的C#学习教程,学懂了这些基本的,大多都能开发了
  • 学习内容:Windows窗体设计中的控件层次顺序,及如何为控件增加方法 实现效果: 处理三个label控件的MouseClick事件。单击时,调用BringToFront方法增加对应控件的Z顺序,当用户右击时,调用SendToBack方法来减少...
  • How can we implement Windows Forms Designer in a WinForms application ? Visual Studio uses System.ComponentModel.Design namespace to implement the Form Designer. How can we use this to implement a For...
  • Windows窗体布局非常简洁大方,以至于我们习以为常,都没有感觉到设计师们的经验的技巧。本文就以以Windows下快捷方式的属性窗体为例,让我们深入学习一下,微软设计师的设计经验。PS,这个设计技巧可以使用C#进行...
  • C#windows窗体设计器将控件设置Anchor为Bottom,或者带着Bottom。只要页面刷新就会上移2位。问这个这么解答。最好有详细图形办法。 具体操作为页面中放一个控件,设置Anchor为Bottom。然后保存,记住当前控件横纵...
  • namespace 窗体的浮动及隐藏{ partial class Form1 { /// <summary> /// 必需的设计器变量。 /// </summary> private System.ComponentModel.IContainer components = null;...
  • 设计一个简单的计算器,实现两个数的加减乘除,处理“计算”按钮的Click事件,实现四则运算。 判断计算需要的两个数是否为空。 利用double.Parse()方法,将文本框中的两个操作数转换为double类型 利用switch结构...
  • 公司的项目,winfrom窗体的有一排的导航按钮,一旦我生成/重新生成项目,这一排的导航按钮就都没有了,但是在frm.Designer.cs里面 Windows 窗体设计器生成的代码里边还有那些控件
  • 今天早上打开VS2008一个程序,突然提示,“分析 EntityName 时出错。”百度了一下才知道是字符惹的祸。 ...检查程序路径,确实有个“&”符号,只要把它改了就没事了,真是一个字符惹的大麻烦啊
  • VS2015打开别人的设计,WPF应用程序窗体可以通过鼠标滚轮+Ctrl缩放整个设计的窗口,可windows窗体应用程序就不能缩放整个设计的窗口,可右边还有好多按钮的,如何查看这些按钮?
  • namespace Windows窗体应用程序1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); anotherForm = new Form2(); } private Form2 anotherForm; private void button1_Click...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,974
精华内容 789
关键字:

windows窗体设计