记录WinForm中遇到的问题以及打包安装

关于使用ListView导致子窗体控件焦点设置失效:

        可能是因为使用了ListView做为触发添加子窗体导致的,ListView焦点问题,做一个小测试,用Button点击事件将子窗体添加进GroupBox或者Panel,再用ListView里面的Item的SelectedIndexChanged事件将子窗体添加进GroupBox或者Panel,这个子窗体加载方法内设置某个控件(TextBox之内的)的焦点:

        
        //这两个事件分别是Button按钮和ListView的点击事件/选中事件
        
        private void button1_Click(object sender, EventArgs e)
        {
            this.GroupBox1.Controls.Clear();
            Form2 form = new Form2();
            form.TopLevel = false;
            form.FormBorderStyle = FormBorderStyle.None;
            this.GroupBox1.Controls.Add(form);
            form.Dock = DockStyle.Fill;
            form.TopMost = true;
            form.Show();
        }
        private void MenuSelectedIndexChanged(object sender, EventArgs e)
        {
            this.GroupBox1.Controls.Clear();
            Form2 form = new Form2();
            form.TopLevel = false;
            form.FormBorderStyle = FormBorderStyle.None;
            this.GroupBox1.Controls.Add(form);
            form.Dock = DockStyle.Fill;
            form.TopMost = true;
            form.Show();
            WOMenu.SelectedItems.Clear();
        }


        //以及Form2中的加载方法
        private void Form2_Load(object sender, EventArgs e)
        {
            textBox1.Focus();
        }

         然后分别点击两个控件并观察Form2中TextBox的焦点是否设置成功,通过观察可以发现Button添加的子窗体焦点设置成功了,而ListView添加的设置失败了(暂且称为ListView的焦点问题,具体原因我也不知道,如果有大佬看到了这个问题可以私信我并为我解释我会非常感谢你!Orz再次膜拜大佬 )。好,下面是另一种解决方法:在Form的Paint事件中设置TextBox的焦点,这样就是OK的,Load、Shown、Activated这些事件中设置焦点均不成功!

        窗体加载的执行顺序为:Load——>Activated事件只有获取到焦点时才会触发(由于我是将子窗体添加进主窗体内,所以焦点还在主窗体)——>Shown——>Paint。

关于ComboBox控件宽高设置失效:

        combobox控件的宽高是跟字体大小挂钩的,调整字体大小即可调整宽高。

关于ComboBox控件运行时可修改其内容:

        将combobox控件的DropDownStyle属性设置为:DropDownList

关于皮肤控件“SkinEngine”:

        设置所有窗体都是同一种皮肤时:可以只在第一个窗体中添加该控件,然后设置其属性应用到所有窗体。例:

                第一个窗体是登录窗体,就修改登录窗体的Designer初始化文件,找到SkinEngine皮肤控件的实例化位置,

                将

                        this.skinLogin = new Sunisoft.IrisSkin.SkinEngine();

                修改为:SkinAllForm = true表示应用到所有窗体

                        this.skinLogin = new Sunisoft.IrisSkin.SkinEngine((System.ComponentModel.Component)(this))
                        {
                                SkinAllForm = true,
                                SkinFile = Application.StartupPath + @"\SkinUI\MP10\MP10.ssk"
                        };

        使用SkinEngine皮肤控件之后无法修改Label颜色:可在加载事件中重新设置该Label应有的颜色。

        使用SkinEngine皮肤控件之后无法修改Button的背景颜色:可将Button控件的Tag属性设置成和SkinEngine皮肤控件一样,再设置该Button控件的颜色。例:

                btn_hi.BackColor = Color.Blue;
                btn_hi.Tag = 9999;//皮肤控件的Tag属性为9999,所以Button也为9999

关于窗体控件加载过慢(如添加了自适应代码或控件过多等导致的):

        可以为该窗体添加双缓冲代码:

                protected override CreateParams CreateParams
                {
                    get
                    {
                        CreateParams cp = base.CreateParams;
                        cp.ExStyle |= 0x02000000; // 用双缓冲绘制窗口的所有子控件
                        return cp;
                    }
                }

关于GroupBox控件鼠标经过时边框闪烁:

        可将GroupBox控件的FlatStyle属性设置为:System

关于窗体中使用了SplitContainer控件导致该窗体被当成子窗体显示时控件丢失的问题:

        SplitContainer控件占满整个Form并且Dock属性为Fill的情况下:修改SplitContainer的Dock属性为None(先将为Fill时的窗体Size复制下来,再设置为None并将Size属性添加上去),然后该窗体被当做子窗体显示时就正常了。

关于WinForm程序的打包安装:

  1. 安装VS拓展:Microsoft Visual Studio Installer Project。
  2. 右击解决方案,添加一个Setup Project项目。
  3. 将要打包项目的Debug目录里面的内容全部添加进Application Folder文件夹。
  4. 右击exe文件,选择Create Shortcut to "项目名"(创建快捷方式)
  5. 修改该快捷方式的名称,以及属性中的Icon(图标),该图标的路径不能有中文不能有中文不能有中文,然后将该快捷方式拖到User's  Desktop(用户桌面)以及User's Programs Menu(用户开始菜单),安装后用户桌面会产生该快捷方式。
  6. 然后将卸载程序(路径:C:\Windows\System32\msiexec.exe)复制进Application Folder文件夹。右击创建卸载程序的快捷方式,同样是修改快捷方式的名称以及图标,注意:选中此Setup项目,点击属性,将ProductCode的内容复制下来,配置ProductName(安装时的名称),将卸载程序的快捷方式的Arguments修改为:/X ...(复制的内容),/X后面有一个空格,配置完成之后右击Setup项目生成就可以了。Debug内就是打包后的文件,正常有两个:setup.exe和Setup.msi。

    

     

猜你喜欢

转载自blog.csdn.net/qq_51502150/article/details/126845990