zoukankan      html  css  js  c++  java
  • Visual studio之C#的一些常见问题

    背景

    要写一个APP,APP通过串口控制下位机,在此记录C#的一些常用控件的使用办法。

    正文

    1. 单击button控件,执行对应操作。
      选择要操作的button控件,在属性栏内点击类似闪电标志一样的事件,找到操作,选择Click,双击,即会在主程序中生成对应的单击事件处理代码,如下所示:
    private void Combtn_Click(object sender, EventArgs e)
    {
            // 单击按键即会执行该段代码
            Button Combtn = (Button)sender;
    
            Combtn.Text = "按钮按下";
    }
    

    Sender代表触发事件的那个控件,此处,Sender既是按钮,如上所示,将Sender赋值给正确类型的对象,即可实现对Button控件的操作。
    e则代表该事件传入的参数。此处没有使用,在竹影青瞳的博客关于(object sender, EventArgs e)中已做了详细介绍。

    1. C#中声明全局变量
      首先,建立一个空的类GloableVar,在该空类声明各种全局变量,一定要声明为public,并且变量为static,这个static是关键!类我们可以理解为声明了一个群体类型,但是该类型不占用实际空间,就相当于char``int等关键词,但是在该类内参数加上了static,既对该类对应的参数分配了实际空间,这样我们就模拟实现了全局变量的效果。代码如下:
    namespace Lazercontrol
    {
        public class GloableVar
        {
            public static bool lazerstate;
            // 此变量的调用办法,既直接类名GloableVar.lazerstate即可。
        }
    }
    

    若是需要声明一个全局的类变量,而不是单个变量,那就需要先new一个该类即可,如下:

    namespace Lazercontrol
    {
        public class GloableVar
        {
            public static SerialPort serialPort1;    // class SerialPort
        }
    }
    // 在初始化函数内,new一个变量
    private void InitializeSerial()
    {
            GloableVar.serialPort1 = new SerialPort();
            // new一个变量
            // 调用方法
            GloableVar.serialPort1.PortName = "COM1";
    }
    

    加了static后,new的实体保存在里,之后再new任何次,实体不变,就这一个。
    未加static,则new的实体保存在里,之后每new一次,会生成一个新的实体。
    此处感谢曾老师的C#技术支持。(手动阴笑)

    1. 单击按键打开新的窗体
      首先,创建一个新窗体,方法为,右击项目名称点击添加Windows窗体,重命名名称即可,此处名称为Comsetting。接着在主窗体内实例化窗体,代码如下:
    namespace Lazercontrol
    {
        public partial class Mainwin : Form
        {
            ComSetting comwin;  // 实例化ComSetting窗口
    
            public Mainwin()
            {
                InitializeComponent();
            }
            // ```其他代码省略
        }
    }
    

    按照1方法,进入到按键触发处理函数中,将窗口实例化,然后调用show()函数,打开新窗体,代码如下:

    private void Combtn_Click(object sender, EventArgs e)
    {
            Button ComBtn = (Button)sender;
    
            comwin = new ComSetting();
            comwin.ShowDialog();    
            // 打开的窗体关闭后,才能操作其他窗体
            // 也可以是comwin.Show();,这个就没有限制 
    }
    
    1. C#控件大小随窗体大小等比例变化
      参考天黑不熄灯的博客园的博客C#控件大小随窗体大小等比例变化
      ** 定义全局变量
    private float X;//当前窗体的宽度
    private float Y;//当前窗体的高度
    

    ** 功能函数setControls

    //根据窗体大小调整控件大小
    private void setControls(float newx, float newy, Control cons)
    {
            //遍历窗体中的控件,重新设置控件的值
            foreach (Control con in cons.Controls)
            {
                string[] mytag = con.Tag.ToString().Split(new char[] { ':' });//获取控件的Tag属性值,并分割后存储字符串数组
                float a = System.Convert.ToSingle(mytag[0]) * newx;//根据窗体缩放比例确定控件的值,宽度
                con.Width = (int)a;//宽度
                a = System.Convert.ToSingle(mytag[1]) * newy;//高度
                con.Height = (int)(a);
                a = System.Convert.ToSingle(mytag[2]) * newx;//左边距离
                con.Left = (int)(a);
                a = System.Convert.ToSingle(mytag[3]) * newy;//上边缘距离
                con.Top = (int)(a);
                Single currentSize = System.Convert.ToSingle(mytag[4]) * newy;//字体大小
                con.Font = new Font(con.Font.Name, currentSize, con.Font.Style, con.Font.Unit);
                if (con.Controls.Count > 0)
                {
                    setControls(newx, newy, con);
                }
            }
    }
    

    ** 在窗体的Load事件中添加

    private void Form1_Load(object sender, EventArgs e)
    {
            X = this.Width;//获取窗体的宽度
            Y = this.Height;//获取窗体的高度
            setTag(this);//调用方法
    }
    

    ** 在窗体的Resize事件中添加

    private void Form1_Resize(object sender, EventArgs e)
    {
            float newx = (this.Width) / X; //窗体宽度缩放比例
            float newy = (this.Height) / Y;//窗体高度缩放比例
            setControls(newx, newy, this);//随窗体改变控件大小
    }
    

    注意:窗体属性内MaximizeBox要设置为true

    1. C#窗体全屏功能
      参考jack_Meng的博客C#窗体全屏功能

    2. 设置窗口当用户按Enter时,所单击的窗体的按钮
      在窗体的load事件中,添加如下代码:

    private void Mainwin_Load(object sender, EventArgs e)
    {
            this.AcceptButton = Yourbutton_name;
    }
    

    也可在窗体属性内找到Accecptbutton,选择对应button按键的ID。

    1. 设置书签
      按下组合键Ctrl+F2设置书签,再按组合键Ctrl+F2消除书签;按下F2跳转到下一个书签,按下Shift+F2跳转到上一个书签。

    2. 显示行号
      点击工具-->选项-->文本编辑器-->C#-->勾选行号

    3. switch() {case CONST: break;}语句中,case后面的常量表达方法
      在C/C++中,switch() {case CONST: break;}语句中的CONST常常使用宏定义来定义,但在C#中却没有宏定义,所以可以用C#的enum来解决,也可以用const常量来表示,举例, case两种值,0xF0/0x0F,分别为MOD1/MODE2,若直接用数字表示则不太直观,所以用const来替代,代码如下:

    const byte MODE1 = 0xF0;    //注意常量声明为 byte
    const byte MODE1 = 0x0F;
    switch(Mode)
    {
            case MODE1:
                break;
            case MODE2:
                break;
    }
    
    1. 多个非UI线程如何访问UI控件而不被报异常
      在多线程程序中,新创建的线程不能访问UI线程创建的窗口控件,如果需要访问窗口中的控件,可以在窗口构造函数中将CheckForIllegalCrossThreadCalls设置为 false,即将将禁止跨线程访问的检查禁能,即允许多线程访问UI控件,这个会造成无端的错误,因此不推荐使用,可以参考此篇博客C# 跨线程调用控件
    // 跨线程访问不被检查
    Control.CheckForIllegalCrossThreadCalls = false;
    

    参考于多线程中使用CheckForIllegalCrossThreadCalls = false访问窗口;
    11.

    参考链接

    不定期更新

    记录时间:2017-4-7
    记录地点:深圳WZ

  • 相关阅读:
    java里面的设计模式
    MHRD_Guide
    flutter 入门(Mac)
    K8S实战-构建Django项目-03-使用共享存储
    《Effective Java》笔记45-56:通用程序设计
    机器学习实验二-集成学习
    -scp Linux之间复制文件和目录
    吴裕雄--天生自然 人工智能机器学习项目:地图数据及细胞图片数据处理报告(续五)
    吴裕雄--天生自然 人工智能机器学习项目:地图数据及细胞图片数据处理报告(续四)
    吴裕雄--天生自然 人工智能机器学习项目:地图数据及细胞图片数据处理报告(续二)
  • 原文地址:https://www.cnblogs.com/ChYQ/p/6678588.html
Copyright © 2011-2022 走看看