Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts


解决WPF中ContextMenu绑定RoutedCommand时第一次无法执行的问题

WPF中RoutedCommand是一个非常常用的功能,他能够将某一命令绑定到多个控件上,比如同一个命令可以绑定到Button,Menu,ContextMenu上,这样避免了重复的代码。     但初次使用RoutedCommand时我就遇到了一个很奇怪的Bug,就是将右键弹出菜单ContextMenu的某一个菜单和窗体上的某个Button同时绑定到了某一个命令上。在程序初次运行时,ContextMenu里面的绑定了命令的菜单是灰色的,不可用,即使设置IsEnable=true,也不行。而Button却是正常的,但在点击Button执行一次命令后,ContextMenu里面的菜单就变得可用了。     在一顿搜索之后发现了这篇文章How to Solve Execution Problems of RoutedCommands in a WPF ContextMenu,完美的解决了这一问 …

WPF ContextMenu RoutedUICommand CommandManager FocusManager

WPF单例应用程序的两种实现

在某些场景下,我们需要应用程序只开启一个实例,本文介绍了WPF中单例应用程序的两种实现,一种是删除App.xaml,手写Main函数来进行启动调度,他的优点是性能相对较好,只需要定义一个Mutex即可,缺点是他放弃了WPF程序中App.xaml的一些默认功能,比如可以存放全局资源样式,没有App.xaml使得在某些情况下,其他的窗体除非手动引用资源或样式,否则得不到设计时支持,这两个缺点都可以通过代码或者设计时标签来回避。另外一种方法是保留App.xaml文件,注册Startup方法,在该方法里启动一个后台线程来监测多次打开的行为,当检测到试图打开多次时,将上次的应用打开,它的缺点是额外多增加了一个工作线程。相比第一种方法来说开销较大,但对于当今的CPU来说,多一个线程处理似乎可以忽略,并且这个线程里面使用的是WaitHandle,实际并不占用太多资源。 …

WPF Single Instance Application

SQLServer中使用TVP和SqlBulkCopy批量插入数据

在有些场景下,我们需要批量插入数据,本文介绍了SQLServer中的两种比较高效的批量数据操作方法,它们是TVP表值类型存储过程以及SqlBulkCopy,他们的共同点是通过传输DataTable作为参数,批量插入数据,不同点在于TVP方法需要SQLServer 2008及以上版本,并且需要预先创建表值类型和存储过程,SqlBulkCopy方法则更简洁,不需要额外创建类型或者存储过程。 …

SQLServer TVP SqlBulkCopy Dapper

在WPF的ViewModel中更新UI界面

凡是做UI界面,不管是Winform也好还是WPF,都只有一个UI线程,我们不能在UI线程中执行耗时的操作,因为这样会阻塞UI线程,是的界面变得卡顿,十分影响用户体验。本文以Prism的MVVM模式为例,通过两个场景: 耗时操作通过异步回调返回值和耗时操作直接返回值两种场景,介绍了如何在ViewModel中执行耗时操作,并更新UI界面。 …

MVVM WPF Prism UI Thread

优雅的生成应用程序图标文件

桌面应用程序通常会选择一个ico文件作为程序图标,这个图标会在快捷方式的时候展示。常用的做法是找一个png文件,把它转为.ico文件,但如果ico文件只有单一分辨率,则系统会根据用户的查看选项,而对这单一图标进行缩放,这种缩放会使得图像模糊或者产生锯齿。且这种做法丢失了ico文件的单个图案,多尺寸,多色板优点。本文介绍了如何正确生成ico文件的方法,让您的应用程序图标在不同的分辨率条件下更美观。 …

ico file

OpenFileDialog中根据文件名过滤选择文件

在应用程序中,如果需要用户选择文件,就会用到OpenFileDialog控件,这个控件可以方便用户来选择文件。它提供了一些属性,其中比较重要的有“Filter”,它能够根据后缀筛选过滤文件。但没办法根据文件名进行进一步筛选,但好在可以使用FileName属性,在里面使用一些通配符来在一定程度上解决这一问题 …

OpenFileDialog

ThinkPad W540硬件升级以及安装Windows11

几年前,朋友送了一台笔记本给我,这笔记本是2014年款的ThinkPad W540,在当年来说,性能还是不错,但是放到现在已然已经过时了,但由于贫穷,于是在手动进行了一些配置硬件配置升级后,只能继续使用。这里记录一下我对这台笔记本的一些升级以及如何在上面安装Windows 11操作系统的。     有了小孩之后,这台笔记本其实放在家里已经很少打开了,上周五碰到单位同事有点事情,需要笔记本操作一下,发现已经放了至少6个月没开机的笔记本无法启动了。怀疑是之前加装的128G的那块启动固态硬盘坏了,应该找不到分区表。于是打算折腾一下,今天终于搞好了。 …

Windows 11 ThinkPad W540

线程创建过多导致产生OutOfMemoryException的问题及优化

今天在线上环境又吃了一个bug,程序之前运行良好,最近在增加了数据量之后,启动的时候就直接报了OutOfMemory的bug,但明明内存占用只有100多M。在查看日志后发现,在调用Thread.Start创建线程的时候报了OutOfMemoryException,这里记录一下如何查找原因以及对应的修改方法。 …

OutOfMemory .NET Thread

使用WPF来绘制K线图

最近在研究WPF下绘制K线图的功能,由于WPF下图表控件很少,且大多都是收费的,如果自己从头开始写比较复杂,于是研究了一下amCharts Stock Chart for WPF这个控件,并用ILSpy反编译出了他的源码,研究了一下其中的K线绘制功能。 …

ILSpy CandleStick WPF

列出计算机中的等宽字符

根据针对不同字符显示的宽度是否相同,可以将字体区分为等宽字体(monospaced fonts)和比例字体(proportional font)。等宽字体是指在改字体下,所有字符的宽度都相等,对于显示“w”和“i”来说,这两者字符所占宽度相等,“i”的两边会用空格填充从而达到跟“w”相同宽度。比例字体则是针对不同字符,使用不同宽度显示。现在大部分字体都是比例字体,因为其更加紧凑和美观。但在某些领域,比如程序设计中的代码展示,则由于等宽字体有诸如显示清晰,对齐方便等优点成为代码显示的首选,本文介绍了两类字体的区别,如何区分,以及如何使用代码列出本地计算机安装的所有等宽字体的方法。 …

monospaced fonts proportional font