我们经常会尝试用一用反射来解决一部分动态可执行代码的问题,不过这个问题在 UWP 中似乎并不那么轻松。也许你写了一句获取某个类所有属性的代码,结果发现 DEBUG 下跑得好好的,RELEASE 下居然拿不到! 尝试反射获取属性 你的代码可能是这样的: var properties = typeof(SomeType).GetProperties(); 或者这样的: var p...
使用 filter-branch 从 Git 历史中删除一个文件
昨天帮助小伙伴从 Git 提交历史中删除了一个文件,虽然一开始尝试使用 filter-branch,但是因为需要的时间太久,就放弃了,转而使用 cherry-pick 的方案。 但是,毕竟 Git 官方给的方案是 filter-branch,所以今天就在另一位小伙伴的帮助下好好阅读 Git 官方文档:Git - 重写历史 和 Git - git-filter-branch Document...
Why Unload Twice
Sometimes WPF raise unload event twice. In this case, it happens when a logical tree is build all by myself. Why unload twice? It really confused me. Any help would be appreciated! The repo: walte...
找回你 C 盘丢失的空间(SpaceSniffer)
什么鬼!C 盘空间满了!我分了 120GB 啊!!!是不是要删软件删游戏,是不是要重装系统? 尤其是程序员,那么多开发环境(Visual Studio 不说话 :))空间占用那叫一个大啊!为了避免重装系统,我找到了一款神奇的软件——SpaceSniffer。 话不多说,上神器: SpaceSniffer 官网:Uderzo Software SpaceSniffer S...
如何向整个 Git 仓库补提交一个文件
微软在 Reference Source 里开放了 .NET Framework 多个版本的源码。为了更方便地阅读这些源码,我们把每一个版本都下载下来后按顺序提交到 git 仓库中。 但是!!!居然忘了在第一次提交之前放一个 .gitignore 文件!如果没有这个文件,那我们每次打开源码查看都会带来一大堆不明所以的修改文件。那么多的源码,绝对不会想重新挨个版本再提交一次。于是找到了一条可...
Exception.Data 为异常添加更多调试信息
我们抛出异常是为了知道程序中目前的状态发生了错误。为了能够知道错误的详细信息便于我们将来避免产生这样的错误,我们会选用合适的异常类型,在异常中编写易于理解的 message 信息。但是有时我们需要更多的信息进行调试才能帮忙在将来避免这个异常。 System.Exception 类中就自带了这样的属性 Data,它是 IDictionary 类型的: public virtual ID...
WPF 渲染系统(WPF Render System)
一个朋友问我:“为什么几千个 Visual 在视觉树上,增加删除几个能够那么快地渲染出来?”这个问题问倒我了,因为我对 WPF 渲染系统的了解很少,更不知道渲染部分和 UI 逻辑部分是如何分工的。 在此机会下,我毫不犹豫地打开 https://referencesource.microsoft.com/ 阅读 WPF 的源码。 对探索源码章节不感兴趣的读者,可以直接跳到后面大胆猜想与理...
解决XAML设计器中遇到的那些错误
使用 Visual Studio 开发 WPF 程序时,XAML 设计器能够极大提高我们的开发效率。不止是写出的代码无需运行就能看到效果,还有能够直接在设计器中点击定位元素以及拖拽改变属性。 但是,XAML 开发不总是那么幸运! 因为我们总能在设计器中看到这样的一幕: 如果你看完之后无奈又无助,那这篇文章正好将帮你分析 XAML 设计器出错的各种可能原因以及解决这些问题的思路。 ...
使用链接共享 Visual Studio 中的代码文件
如果你还在通过复制来共享代码就太 out 了! 我们知道,将公共的代码抽取成库是非常好的代码复用手段,但有时我们需要复用的代码(或文件)无法提取到库中。这时,Visual Studio 自带的 Link 功能就派上用场了。 链接的文件长这样 如上图,链接文件其图标上会有一个小图标。图中的 A 和 B 两个项目都是应用程序项目(不是类库),所需的图标和数据库是需要共享的,于是将其...
KeyDown/PreviewKeyDown 事件中监听 Alt 键按下
在 WPF 应用程序(或者其他 Windows 应用程序中),为了监听 Alt 键按下,我们可以在 KeyDown 事件中写源码。然而,运行一看,发现并没有什么用。打个断点看下会发现,e.Key 的值是 Key.System。这就奇怪了,Key.System 是个什么鬼? 一个坑 在WPF应用程序(或者其他 Windows 应用程序中),为了监听 Alt 键按下,我们可以尝试写出这样...
关联一个文件扩展名或协议
在 Windows 中关联程序或协议是通过注册表项实现的,编写任意一个程序甚至只是个脚本来写注册表即可实现。 注册表项的位置在这里: HKEY_CLASSES_ROOT\XXX\shell\open\command
未知的编译错误:“已添加具有相同键的项。Unknown build error, 'An item with the same key has already been added.'”
未知的编译错误:“已添加具有相同键的项。” Unknown build error, ‘An item with the same key has already been added.’ 本文将解释编译时产生此问题的原因,并提供解决方法。 出现此问题的原因 出现此问题的原因是:csproj 文件中存在两个对相同文件的引用行。 例如: <ItemGroup> ...
为程序签名
给应用程序签名,可以让系统知道你的程序是受信任的程序。一部分操作,系统只会为受信任的程序开启。 创建私人证书 makecert -r -pe -n "CN=Test Certificate - For Internal Use Only" -ss PrivateCertStore testcert.cer 安装私人证书 certmgr.exe -add testcert.cer...
减速动画 AnimationShiftKey
想不想让你 Windows 自带的各种动画都变得缓慢?这可别有一番风味啊!顺便还能观察下系统的动画是怎么实现的呢。 修改注册表即可实现: Windows Registry Editor Version 5.00 [HKEY_CURRENT_USER\Software\Microsoft\Windows\DWM] "AnimationsShiftKey"=dword:00000001
为什么桌面上可能有两个同名文件?
是否见过桌面上同时存在两个同名的文件?这其实是可能的。 我们见过这样的情况: 当打开隐藏文件和系统文件时,桌面上会看到这样两个同名的文件。 虽然 Windows 不允许在一个文件夹中同时存在两个同名的文件,但我们知道“桌面”不是普通的文件夹。 在默认的 Windows 系统设置中,桌面上显示的图标不仅来自于当前用户帐户专有的“桌面”配置文件夹, 也来自于所有用户帐户共有的“公共...
FileSystemWatcher 监视文件改变
要监视文件或文件夹的改变,可使用 FileSystemWatcher。 FileSystemWatcher fileWatcher = new FileSystemWatcher { Path = watchingFolder, NotifyFilter = NotifyFilters.Size | NotifyFilters.LastWrite, Filter...
FileShare 读取一个其它进程正在写的文件
Windows 允许多个应用程序同时读取一个文件,即便这个文件正在被写入。 private string[] ReadLogLines(string key) { FileStream fs = new FileStream(_watchingFileNameDictionary[key], FileMode.Open, FileAccess.Read, FileShare.R...
Windows DPI Awareness for WPF
对于 WPF 程序,要控制程序的 DPI 感知程度,可在 App.manifest 中添加如下代码。 本文知识已经陈旧,你可以阅读这两篇文章来了解更新的 Windows DPI 应用知识: Windows 下的高 DPI 应用开发(UWP / WPF / Windows Forms / Win32) - walterlv 支持 Windows 10 最新 PerMonito...
CallerMemberName
从 .NET Framework 4.5 开始,有了几个快速获取调用方信息的 Attribute。 Attribute 描述 CallerMemberName 允许您打算调用方的方法或属性名称传递给方法。 CallerLineNumber 允许您...