C#
我又何必慨叹
毕业于郑州大学软件工程专业,目前从事Windows桌面软件、Linux服务器应用开发,熟悉C#、C/C++、Pyhton等编程语言
展开
-
使用DevExpress22.X(Patch)控件库在VisualStudio2022使用C#进行Winform、WPF应用的开发,看这一篇就够了!
写在开头,Dev Express是个十分强大的控件库(下文简称Dev),但碍于其高昂的使用费用,“出于学习目的”,我们一般使用的都是Patch版本(在版权意识日趋加强的当下,不要提那两个字,现在加上那些字,百度都搜不出内容)。原创 2023-04-13 14:47:10 · 14791 阅读 · 20 评论 -
Winform控件布局之Dock和Anchor配置与自动大小
复杂界面,要做到好的设计,是需要逐步将复杂界面进行两两拆分,第一步把整个窗体拆分为基本控件一+其他控件的容器一进行设计,第二步把其他控件的容器拆分为基本控件二+其他控件的容器二进行设计... ...所以布局设计的基础操作,是对容器/窗体中的两个控件进行布局,再复杂的窗体也只是不断拆分成基础操作去重复;同时要实现控件的自动大小调整,其核心使用控件的Dock属性,使其跟随父容器的大小变化而变化。(All/Left/Right/Top/Buttom),影响控件一被“码”的位置,调整以至于给控件二预留合适大小;原创 2022-12-13 11:01:20 · 1596 阅读 · 0 评论 -
C#开发——Winform中ToolTip闪烁的解决方案
采用的比较多的方式是,对该控件的MouseMove和MouseLeave事件进行处理。至于为什么不是MouseEnter或者MouseHover,是因为Enter和Hover都是Move触发时间段内起始点和某一特定时间点的一次特定触发。原创 2022-12-12 09:33:41 · 1759 阅读 · 0 评论 -
Winform和WPF数据绑定区别小结
首先说WPF,初识数据绑定这一概念,是在做了3年Winform开发,后转做WPF项目,按照MVVM模型进行编码时,才开始了解使用的。而一直以为数据绑定作为MVVM的核心内容,仅在WPF上适用,后来才了解到在Winform中同样适用,比较著名的比如国产的DevExpress控件,相信做Winform开发的都会有所耳闻。......原创 2022-08-26 12:02:52 · 550 阅读 · 1 评论 -
C#的全局编译开关
首先的,我们知道,在C/C++的.c/.cpp/.h等中可以定义各种宏,这些宏在编译前会被编译器替换为指定的内容。并且,这些宏都是全局的,即不能存在两个名称相同的宏。而这些宏,是可以在一些情况直接作为编译开关的,比如: 在C#中,没有宏这一功能,但是可以类似的定义一些编译开关。通常的我们需要在.cs开头部分使用“#define ”+“开关名称”定义,比如:但是在多个文件中不想定义多个编译开关要怎么办,vs早就考虑到这点了,右键工程——属性,如下设置: 最后效果如下图,原创 2022-06-06 10:08:56 · 835 阅读 · 1 评论 -
在部署程序中通过msiexec安装其他依赖程序
原创 2021-03-25 12:04:33 · 156 阅读 · 0 评论 -
windows右键菜单
注册表是个好东西!附上通过修改注册表,在资源管理器或桌面其他地方右键运行CMD的博客:修改右键CMD注册表那么当然地,可以将我们的应用程序通过修改注册表,添加默认工程文件打开方式,比如熟知的.doc通过word或WPS打开,我们的.sln通过VS打开等等,后续实现后补充代码(思路是这样)...原创 2021-03-25 11:09:15 · 87 阅读 · 0 评论 -
同步对象的使用
原创 2021-03-23 14:45:12 · 117 阅读 · 0 评论 -
WPF的ListView.ItemContainerGenerator.ContainerFromIndex(xx_index)获取到的item控件为null
如上图UpdateTogBtnView方法中,要通过PortList(类型为ListView,其中item的类型为BasePort),在窗体load(在其他窗体load中已调用)但其Visibility并非是Visibility.Visible。若此时通过PortList.ItemContainerGenerator.ContainerFromIndex(index)或ContainerFromItem用于发现item控件,会获得null。调试中可以发现获得空的item控件时,PortList...原创 2021-03-23 11:50:32 · 1036 阅读 · 0 评论 -
WindowsInstaller生成部署程序时:WARNING: Unable to find dependency xx (Signature=xx Version=xx) of assembly
个人遇到的问题:生成部署程序时遇到十几条“warning”类型的输出信息,表明依赖项程序集版本不对。但是:生成解决方案的原因不在于此,是由于“warning”后的“error”类型信息,这才是生成失败的最终原因。解决:根据“error”类型的信息解决程序集错误,问题解决。其他关于部署程序的解决思路:①部署程序解决方案——属性——目标平台(TargetPlatform)——x86、x64、Itanium;②主程序、依赖程序库的目标平台,要和部署程序解决方案目标平台一致;③修改你的其他依赖库原创 2021-03-19 21:04:25 · 2081 阅读 · 0 评论 -
WPF通用隐藏控件方法(举例Header)
在使用ListView、GridView、TreeView等等这些控件时,往往会遇到需要隐藏其Header的需求。分析:所有WPF控件都继承自Control,那么所谓的隐藏Header,实际上就是将显示Header的控件隐藏掉。本文介绍的方法,个人认为可以适用于其他任何需要隐藏控件的场景——即将高度或宽度置为0。————————————————————————————————————————————————直接上图:上图创建GridViewColumnHeader类型的Style为“原创 2021-03-03 12:03:37 · 2232 阅读 · 0 评论 -
Windows服务实战(一些小坑)
参考微软文档:创建Windows服务1.按步骤创建并安装例子中的服务后,如下图:2.若在代码中修改该服务的名称(MyService改为hxxService)并重新生成服务(需要停止服务),如下图:3.则上文微软文档中使用VS开发人员命令行(通过InstallUtil.exe)或PowerShell都会卸载失败4.只能将服务名称改回“MyService”并重新生成,才能进行卸载。5.通过例子中的WindowsServiceClient通过服务名称进行卸载是一样的情况,前原创 2021-02-18 10:38:47 · 110 阅读 · 0 评论 -
C#对象、实例等几个易混淆概念
C#新手可以继续往下看,基本功扎实的老鸟可以出门右转,0.0。 变量、对象、(类型)实例这几个概念放在一起会搞混吗? 那么引用类型(对标——值类型)、声明类型、实例类型这几个概念放在一起又会搞混吗? 下面是对于上述概念进行理解的一个例子。 class MyProgram { class RefrenceClass { public int field;//字段 publi...原创 2020-11-28 22:21:24 · 288 阅读 · 0 评论 -
C#继承和多态中的new和override
先上dj,先上dj!public class Employee{ private string _firstName; public string FirstName { get => _firstName; set => _firstName = value; } private string _lastName; public virtual string LastName { ...原创 2020-11-27 17:38:25 · 471 阅读 · 0 评论 -
C#反射使用注意项
C# 关键字protected和internal在 IL 中没有任何意义,且不会用于反射 API 中。在 IL 中对应的术语为“系列”和“程序集”。若要标识internal使用反射的方法,请使用IsAssembly属性。若要标识protected internal方法,请使用IsFamilyOrAssembly。参考:MSDN反射...原创 2020-11-27 12:04:51 · 148 阅读 · 0 评论 -
C#常数在代码中的的二进制表示方式
话不多说,直接上图: 注意区别。 问题①ulong到long的转换,加0b 问题②整数常量太大,加0b原创 2020-11-24 15:38:48 · 1648 阅读 · 0 评论 -
C#浅谈对泛型的认识
泛型,顾名思义,首先它是一个“类”型,其次修饰它的是“泛”,有广泛、宽泛之意。 简单而言,有<T>就是(自定义)泛型。 初识泛型,是在四五年前刚学习C#时,看当时公司大牛的一段代码(向数据库插入一条数据,类似的还有删改查):public bool Insert<T>(T entity){ try { var type = typeof(T); var className = type.Name; ...原创 2020-11-19 19:17:56 · 649 阅读 · 0 评论 -
C#匿名函数之委托、Func、Action、Predicate、Lambda
在写代码的过程中,并不是任何时候都会把一个代码块放在一个命名函数中,而且有可能的情况是:函数太多或者已有相似名称的函数,已经不知道要怎么去命名为好;又或者给中间函数命名后意义不大,基本不会复用......所以匿名函数不失为一种合适的选择。 匿名函数的实现,有多种方式。1.委托 是一种引用类型,本质是方法指针。msdn介绍:委托 个人较常用的场景,在创建线程时:Thread t0 = new Thread(new ThreadStart(delegate { C...原创 2020-11-19 11:43:07 · 678 阅读 · 0 评论 -
依赖IVI、VISA的设备调用问题
一、背景及问题话不多说,直接上问题:1.“Ivi.Visa.GlobalResourceManager”的类型初始值设定项引发异常。应用程序:xx.exeFramework版本:v4.0.30319说明:由于未经处理的异常,进程终止。异常信息:System.DllNotFoundException在Ivi.Visa.ConflictManager.Internal.NativeMethods.VISACM_Close()在Ivi.Visa.ConflictManager.C...原创 2020-10-16 16:40:58 · 9627 阅读 · 0 评论 -
扒一扒C#BackgroundWorker使用中遇到的坑
C#中BackgroundWorker作为.NETFramework封装好的线程类,上手简单,可根据需要为其实例的DoWork、ProgressChanged、RunWorkerCompleted指定相应的委托:分别为DoWorkEventHandler、ProgressChangedEventHandler、RunWorkerCompletedEventHandler,然后再调用该实例的RunWorkerAsync(object argument==null)方法即可在单独线程(意思是非调用线程的另外线程原创 2020-10-10 16:06:45 · 2922 阅读 · 0 评论 -
通过C#Microsoft.Office.Interop.Word理解互操作性
目录一、概念二、应用三、Word操作示例四、总结五、拓展一、概念C# 中的互操作性指的是C#托管代码和非托管代码之间实现互操作性的方法。(参考MSDN:互操作性概述)参考:百度百科——互操作、互操作性、开放系统互连二、应用C#中的互操作性实现主要体现在以下几个方面:①平台调用实现:对DLL动态链接库(非托管代码,导出了函数的DLL)的调用参考:使用非托管 DLL 函数②C++ 互操作实现:使用 C++ interop(又称为 It Just W原创 2020-09-28 16:09:29 · 2676 阅读 · 2 评论 -
从Git上新拉下来的C#工程,其引用库全部被标记为黄色感叹号解决方法
在公司多人协作开发工作中,往往离不开Gitlab、Github、SVN等等其他代码管理平台的使用,以C#工程为例,很经常遇到的情况是,首次拉取代码并打开后,发现引用的dll几乎全部都标有黄色感叹号,包括System这些.net标准库,如下图:遇到这种情况不要慌,抽根烟冷静一下,想一想为什么标准库都没有正确找到,VS怎么这么辣鸡......具体原因是因为工程包含了一些NuGet包,这些第三方库未正确加载导致的。好的,烟抽完了,解决操作如下:①工具——NuGet包管理器——管理解决方案的NuGe原创 2020-09-21 15:29:35 · 6013 阅读 · 5 评论 -
ReaderWriterLock.UpgradeToWriterLock注意点
注解当线程调用UpgradeToWriterLock读取器锁时,无论锁计数如何,线程都将进入写入器锁队列的末尾。因此,在向请求升级的线程授予了写入方锁之前,其他线程可能会写入资源。重要在调用方法的线程UpgradeToWriterLock可以重新获取读取器锁之前,不会引发超时异常。如果没有其他线程正在等待编写器锁,则会立即发生这种情况。但是,如果另一个线程排队等候写入器锁,则调用此方法的线程将UpgradeToWriterLock无法重新获取读取器锁,直到所有当前读取器都释放...原创 2020-09-14 19:10:49 · 142 阅读 · 0 评论 -
C#父类构造中实例化子类,导致堆栈溢出
首先要了解一点,实例化子类时,会调用父类的构造函数,这也是子类中可以访问到父类中除私有变量外的其他变量的原因。1.最简单应用 创建控制台应用,代码如下:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApp1{ class Program { ...原创 2020-07-14 15:48:52 · 481 阅读 · 0 评论 -
多线程WPF程序界面运行一段时间后卡死,后台代码仍在继续运行
1.场景 使用以太网接收单片机发送的PHY电流的数据包,并在基于WPF实现的C#应用程序上进行分析、显示。上位机采用LiveCharts第三方控件用以显示数据(问题所在),电流采样频率为2ms,每采集20条电流发送一包数据。2.代码实现 显示:通过向动态库的事件指针上添加回调函数,并在回调函数内将接收到的数据包存储至Queue,并在后台线程中循环取出队列中已有的数据包,并将其中的数据(电流、时间戳等)添加至已绑定LiveCharts对应的折线图序列,; 数据保存:队列中的数...原创 2020-07-09 16:03:23 · 3128 阅读 · 7 评论 -
WPF编程宝典C#2012 第4版2浅读
使用WPF开发产品半年多,之前都是在Winform上进行开发,初学WPF也并未完全按照MVVM模型去进行开发,于是便在边学边做的道路上前进,基本上就是各种从其他地方Ctrl+C、Ctrl+V,然后修改局部内容将其改成想要的样子,这恐怕也是大部分人经常干的事情吧(大牛勿喷)。 最近这段时间功能开发测试的差不多了,才有功夫回头把之前项目中用到的知识去巩固一遍,找了《WPF编程宝典C#2012 第4版2》电子版(链接资源待审核后更新,),想从头啃一遍,本文作为读到心得或者来记录之前有误解点的记录...原创 2020-05-20 17:46:33 · 567 阅读 · 0 评论 -
VS2019搜索查找文本后程序异常关闭
使用的VS2019 Enterprise企业版,版本号为16.5.30104.148,如下图: 今天在努力写bug的过程中,使用到常用的搜索文本功能时,也贴个图吧: 不管我是点向前、向后、查找全部,VS都会变的奇卡无比,然后悄悄地异常关闭程序。经过不断测试,发现是由于打开的文件太多导致,.cs、.xaml、.xaml.cs等等,如下图: 关闭一些后,问题解决,再使用查找功能时就不会异常退出了。完美!...原创 2020-05-19 17:57:29 · 857 阅读 · 0 评论 -
CS0122 C# _ComObject is inaccessible due to its protection level
在解决方案管理器下找到Fakes文件夹下的xxxx.fakes文件,右键——从项目中排除,重新生成后问题解决。原创 2019-10-12 10:20:05 · 3846 阅读 · 0 评论 -
System.DllNotFoundException: Unable to load DLL 'XX.dll': 找不到指定的模块。 (Exception from HRESULT:
自己是做C#上位机开发的,在公司一个项目中,需要由下位机开发的同事给到C++写的dll供上位机调用,在win10的64位上开发的程序,到了win7的64位上使用不了,以下是报错内容:System.DllNotFoundException: Unable to load DLL 'XX.dll': 找不到指定的模块。 (Exception from HRESULT: 0x8007007E...原创 2019-06-11 20:27:29 · 7279 阅读 · 2 评论 -
Unable to load DLL 'X.dll': The specified module could not be found.(HRESULT: 0x8007007E)
System.DllNotFoundException: Unable to load DLL 'XXX.dll': The specified module could not be found. (Exception from HRESULT: 0x8007007E)自己调试电脑上无论debug还是release都运行正常,但将release打包或者直接给到同事使用,在使用到调用以上d...原创 2019-06-04 19:22:30 · 3870 阅读 · 0 评论 -
使SplitContainer中某个Panel宽度、高度不变
1.在窗体load时加入:splitContainer_AllLayout.SplitterDistance = 120;上边代码字面意思是将水平、或垂直分开的SplitContainer的分区长度设置为1202.只要设置FixedPanel属性为希望宽度不变的panel即可:3.再设置控件不可拖动:splitContainer_AllLayout.IsSplitter...原创 2019-04-12 10:06:26 · 3976 阅读 · 1 评论 -
C#中Chart控件的一些由浅至深的理解
最近在做这样一个桌面应用程序,从公司后台服务器查询后,获取到设备上报的数据(每条都是字符串+JSON的形式),其中字符串里包含了设备名称、上报时间这两条信息,JSON中则包含了数据上报类型、重点关注的设备CPU温度及其他次要信息。需求呢,则是需要将这些数据中的时间、温度筛选出来制成折线图,并达到最终的一个显示效果(算是简单的数据可视化吧)。 其中参考几篇帮助较大的博文:...原创 2018-12-01 16:21:01 · 5724 阅读 · 2 评论 -
VS调试C#程序时,UI界面非常卡
已经是第二次遇到这种问题了,出现问题的原因可能是加入了新控件,添加新引用导致的(直接多个DLL放在debug文件夹下),通过reset了VS之后,再清理解决方案、重新生成,之后再调试就解决了UI卡顿、点击控件进行切换界面时加载缓慢的问题。参考地址:https://www.cnblogs.com/licin/p/6141167.html...原创 2018-09-19 09:41:15 · 3204 阅读 · 0 评论 -
.Net中控件Visible属性设置为true失效,并不显示出来的问题
问题:在设计界面的过程中,在主线程设置按钮和label控件的visible属性时无效的问题,论坛上看到有人说把控件删了重新添加,实验后无效。问题根源:添加控件后,对其进行如下操作:在form设计页,点击选择控件后,找到visible属性,选择了false,然后再在代码里改变该属性,并不能显示出来。解决方法:设计页必须设置为true,即可见,然后在formload事件中,再将其设置为fals...原创 2018-09-13 11:48:10 · 9077 阅读 · 3 评论