C#
两个轮子
这个作者很懒,什么都没留下…
展开
-
【WPF】向command中传递EventArgs参数,使用mvvmlight
一般code-behind中的事件有sender和EventArgs两个参数,而如果采用MVVM的模式,command中只能传递一个commandParameter参数。可以使用EventTrigger,结合MVVMLight提供的EventToCommand,将属性PassEventArgsToCommand设置为True,在ViewModel中使用RelayCommand<EventA...原创 2019-10-29 21:20:31 · 6751 阅读 · 2 评论 -
MVVM架构的WPF中实现ListBox内容自动换行和滚动到最下方
场景应用程序主界面需要显示程序运行中的log信息,随着log信息的增多,应能自动滚动到最新的一条信息。针对不同的信息显示不同,比如info信息正常显示,error信息标红提醒。由于使用的MVVM架构,希望xaml文件中只出现Binding LogText,将显示与逻辑分离。选择ListBox作为显示的控件,存在两个问题:当log信息长度超过ListBox宽度时,不会自动换行;无法通过...原创 2019-07-25 22:15:29 · 6812 阅读 · 1 评论 -
【WPF】如何绑定多个Command到一个Button上,使用EventTrigger
场景原创 2019-07-17 22:43:01 · 5899 阅读 · 0 评论 -
WPF中实现bool值取反的绑定,使用值转换器ValueConverter
场景xaml设计器中,当一个RadioButton选中时,对应的另一个TextBox取消激活。用代码表述如下:if(RadioButton.IsChecked == True): TextBox.IsEnabled = False;else if (RadioButton.IsChecked == False): TextBox.IsEnabled = True;解决方案...原创 2019-07-16 22:25:58 · 10075 阅读 · 2 评论 -
【C#】多个视图的Winforms如何实现MVP(Model-View-Presenter)模式
网上已经有很多讲MVC、MVP、MVVM模式的区别和原理的文章,这里不细说了。具体可以翻本文的参考资料。这里主要讲讲实际项目中的一些经验。背景工作原因接手一个用C#开发的Winforms软件,代码大概一万多行,业务逻辑完全和界面混在一起,没有单元测试。考虑到后面还要优化、修改,每次下手之前读代码都得半天,于是决定重构成MVP模式。MVP模式又分为Passive View和Supervisin...原创 2019-07-02 21:22:37 · 4117 阅读 · 2 评论 -
【C#】如何比较两个对象是否相等(重写Equals方法)
问题: 写单元测试时,需要对比两个对象是否相等,如果使用Assert.AreEqual(mockclass1, class1)永远无法通过。原因: 这里使用了object默认的Equals方法,必须要引用同一个对象,才会返回true 。默认的Equals方法实现的只是同一性(identity),而不是相等性(equality)。合理的Equals方法本应该这样实现:如果obj实参为空,就返...原创 2019-06-01 18:31:45 · 6791 阅读 · 0 评论 -
【C#】单元测试及NUnit的基本用法
单元测试单元测试(Unit Testing)是针对程序弄块(软件设计的最小单位)来进行正确性检验的测试工作。单元测试通常由软件开发人员编写,用于确保他们了所写的代码匹配软件需求和遵循开发目标。单元测试的优点:适应变更。允许程序员在未来重构代码,并确保模块依然工作正确。简化集成。采用自底向上的测试路径,消除程序单元的不可靠,使集成测试变得更简单。文档记录。借助于查看单元测试提供的功能和单...原创 2019-05-28 23:24:33 · 11453 阅读 · 0 评论 -
【C#】ref与out关键字的区别
ref的使用:使用ref进行参数的传递时,该参数在创建时,必须设置其初始值,且 ref侧重于修改;out的使用:采用out参数传递时,该参数在创建时,可以不设置初始值,但是在方法中必须初始化,out侧重于输出;当希望方法返回多个值时,可以用out,并且一个方法中的参数可以有一个或多个out参数;使用out参数,必须将参数作为out参数显式传递到方法中,但是out参数的值不会被...原创 2019-05-28 18:29:05 · 311 阅读 · 0 评论 -
【C#】单例模式的使用
有时候,需要一个类只能被实例化一次,例如设备中只有一个运动控制卡。这时,可以使用设计模式中的单例模式,确保一个类只有一个实例,并提供一个访问它的全局访问点。// 单例模式的实现public class Singleton{ // 定义一个静态变量来保存类的实例 private static Singleton uniqueInstance; // 定义私有构...原创 2019-05-28 18:23:03 · 1529 阅读 · 3 评论 -
【C#】Invoke 和 InvokeRequired,线程安全
如果在winform构建的GUI界面,通过事件响应函数改变控件的状态(比如某个按钮文本为“Open”,单击之后需要显示“Close”),需要在控件响应函数中调用控件的Invoke方法。因为存在一种可能: 如果控件是在主线程创建,进入控件的事件响应函数是在控件所在的线程,而不是主线程。则当在事件响应函数中改变控件的状态,可能与主线程发生线程冲突。C#中是禁止跨线程直接访问控件的,可以使用控件的I...原创 2019-05-25 13:24:39 · 5795 阅读 · 0 评论 -
【C#】UserControl用法
为了避免将所有的控件堆在 MainForm上,导致整个视图和逻辑特别复杂,可以使用UserControl将相关的控件组合起来,独立成一个个小的视图。比如主窗口中有多个Tab选项卡,可以将每个Tab选项卡的视图独立成一个UserControl,通过手动添加或者拖放添加到Form中。下面以PrintPanel为例说明用法(VS2015)。首先,“添加——>新建项——>Visual C...原创 2019-05-25 12:59:58 · 25941 阅读 · 0 评论 -
【C#】多线程之thread与task
最近有个用C#开发的winform软件,需要调用matlab导出的dll文件。最开始把dll中类的初始化放在了主窗体的构造函数里面,结果软件打开30多秒才显示界面。由于dll不是本人写的,没法改,只能在C#程序上想办法。两个方案:使用Timer,在主窗体的load事件里面触发timer,将初始化的代码放在timer_Tick里面。尝试延时10秒触发Tick事件,窗体秒开,但是10s之后...转载 2018-12-22 17:50:57 · 4980 阅读 · 0 评论 -
【C#】VS2015调用Matlab2016a生成的dll文件、MWArray数据类型转换
系统环境:用于生成dll文件的电脑:VS2015专业版,Matlab2016a,均为64位用于调用dll文件的电脑:VS2015社区版,64位生成dll文件这部分网上教程非常多,可以参考:[MATLAB]将.m文件生成dll文件。主要注意的几点:visual studio要安装专业版,详见官方System Requirements and Supported Compilers。...原创 2018-12-17 14:23:15 · 4176 阅读 · 0 评论 -
Visual Studio中计算软件项目总行数
一共有三种方法:用VS自带的代码度量值、正则表达式、严格版的正则表达式。VS自带以VS2015为例,菜单栏的“分析——>为解决方案计算代码度量值”,会自动生成“代码度量值”结果,包括可维护性指数、圈复杂度、继承深度、类耦合度、代码的行数。可维护性指数:计算一个介于 0 和 100 之间的指数值,表示维护代码的相对容易度。值越大表示可维护性越好。圈复杂度:衡量代码在结构上的复杂程度。...原创 2018-12-17 01:14:48 · 992 阅读 · 0 评论 -
VS2015远端调试器无法启动(MSVSMON.EXE)问题
背景: VS2015 通过C#语言调用 MATLAB2016a生成的dll文件,平台都是64位,需要将“属性——&gt;生成——&gt;目标平台”改成x64。问题: 在某些电脑上编译报错,提示是MSVSMON.EXE的问题。原因: Visual studio自身是32位(X86)程序,如果想要调试X64的程序,必须通过一个远程调试器MSVSMON.EXE来进行调试,但是这个MSVSMON.EX...原创 2018-12-19 19:24:27 · 6802 阅读 · 0 评论 -
XML文件解析及C#基本实现
XML文件概述XML全称Extensible Markup Language,可扩展标记语言,与超文本标记语言(HTML,HyperText Markup Language)同属于标准通用标记语言的子集。XML被设计用来传输和存储数据,使文档具有结构性;而HTML被设计用来显示数据。XML的特点是:– 与操作系统、编程语言的开发平台都无关;– 可以实现不同系统之间的数据交互。XM...原创 2018-10-21 20:24:21 · 11752 阅读 · 0 评论 -
【C#】调用DLL文件
实际使用C#的过程中,并不一定所有的函数都需要自己写,可以直接使用已经存在的功能,这些功能一般封装在DLL文件中。C#中的DLL文件又分为托管DLL和非托管DLL。托管DLL文件是在 .NET 环境下生成的dll文件,在公共语言运行库(Common Language Runtime,简称CLR)中能够直接引用的。比如封装各种命名空间的DLL文件,包括System.dll。非托管DLL文...原创 2018-07-05 16:46:21 · 4617 阅读 · 0 评论 -
【C#】EventHandler委托详解
MSDN的解释:EventHandler即事件委托,表示用于处理不具有事件数据的事件的方法。字面上理解就是一个事件处理器,将一个事件与处理事件的方法联系起来的一种机制。 C++中通过函数指针来完成的。 在C#中的事件基于委托模型。委托模型遵守观察者设计模式,使订阅者(接收或处理事件的类)能够向提供方(发送或引发事件的类)注册并接收相关通知。步骤:首先声明一个委托,一般命名为:Na...原创 2018-07-05 00:57:36 · 46041 阅读 · 4 评论 -
【C#】从头开始看一个C#项目
由于软件需要用C#进行二次开发,看了一段时间的语法之后,开始接触官网提供demo工程文件,将从头开始读一个C#项目所遇到的一些知识点记录下来。C#项目的入口一般C#项目中会有一个program.cs文件,可以称为主程序,Main方法为主程序中的入口点,通常是如下模板:static class Program { /// <summary> ...原创 2018-06-13 08:47:40 · 23663 阅读 · 2 评论