摘要: 背景色千差万别,如果希望在这样复杂的背景色下显示清晰可辨的前景色(例如显示文字),那如何选择这样的前景色才能确保适用于所有的背景呢? 灰度图的心理学公式 红绿蓝三色是非常不直观的颜色表示的方法,如果不经过训练,人类几乎没有办法直接通过 RGB 的值来猜出大概的颜色来。而 HSB 是用来解决人眼感知问 阅读全文
posted @ 2017-11-30 01:43 walterlv 阅读(592) 评论(0) 推荐(0) 编辑
摘要: 这篇文章不会说 MVVM 是什么,因为讲这个的文章太多了;也不会说 MVVM 的好处,因为这样的文章也是一搜一大把。我只是想说说我们究竟应该如何理解 M-V-VM,当我们真正开始写代码时,应该在里面的每一层里写些什么。 MVVM,当然三层——M-V-VM。就凭这个“三层”结构,WPF/UWP 开发者 阅读全文
posted @ 2017-11-30 01:33 walterlv 阅读(993) 评论(0) 推荐(0) 编辑
摘要: 如果要你说出 .NET 中的三个异常,NullReferenceException 一定会成为其中一个;如果说出 .NET 中的一个异常,NullReferenceException 也会被大多数人说出来。它让这么多人印象深刻,是因为它在项目中实在是太常见了,常见到每一个 C#/.NET 入门者必然 阅读全文
posted @ 2017-11-30 01:32 walterlv 阅读(511) 评论(0) 推荐(0) 编辑
摘要: 微软终于开始学苹果一样好好做触摸板了(就是键盘空格键下面那一大块)。然而鉴于以前没有好好做,以至于 WPF 程序甚至都没有对触摸板的横向滚动提供支持(竖向滚动是直接使用了 MouseWheel,汗……)。但有些功能真希望能够支持横向滚动!本文将介绍让触摸板支... 阅读全文
posted @ 2017-11-23 22:42 walterlv 阅读(341) 评论(0) 推荐(0) 编辑
摘要: WPF/UWP 中提供的 Path 类可以为我们绘制几乎所有可能的矢量图形。但是,如果这些矢量图形可以以动画的形式播放出来,那将可以得到非常炫酷的演示效果。 我用 Blend 画了我的名字: 然后将它做成了动画: 而要做到这一点,我们只需要关心 Path 的两个属性即可: StrokeDashArr 阅读全文
posted @ 2017-11-23 22:37 walterlv 阅读(519) 评论(0) 推荐(0) 编辑
摘要: 在很久很久以前,WPF 诞生之初,有一个神奇的单位,它的名字叫做——设备无关单位(DIP,Device Independent Unit)。微软给它描绘了一片美好的愿景——在任何显示器上显示的尺寸是相同的。 What the ** is this unit!!! 神 TM 相同!!! UWP 采用有 阅读全文
posted @ 2017-11-23 22:22 walterlv 阅读(250) 评论(0) 推荐(0) 编辑
摘要: 为自己写的程序添加插件真的是一个相当常见的功能,然而如果只是简单加载程序集然后去执行程序集中的代码,会让宿主应用程序暴露在非常危险的境地!因为只要插件能够运行任何一行代码,就能将宿主应用程序修改得天翻地覆哭爹喊娘;而根本原因,就在于暴露了整个托管堆和整个 UI 树。 如果将宿主和插件放到不同的应用程 阅读全文
posted @ 2017-11-23 22:18 walterlv 阅读(576) 评论(0) 推荐(0) 编辑
摘要: 在 WPF 或 UWP 中,我们平时开发所遇到的那些 UI 控件或组件,都直接或间接继承自 Framework。例如:Grid、StackPanel、Canvas、Border、Image、Button、Slider。我们总会自然而然地认为这些控件都是有大小的,它们会在合适的位置显示自己,通常不会超 阅读全文
posted @ 2017-11-23 22:16 walterlv 阅读(289) 评论(0) 推荐(0) 编辑
摘要: 在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法。不过产生 Bitmap 来源却非常多,比如屏幕截图、GDI 图、数组或其它非托管框架生成的图片。 WPF 官方提供了一种方法,使用 System.Win 阅读全文
posted @ 2017-11-23 22:15 walterlv 阅读(371) 评论(0) 推荐(0) 编辑
摘要: 尝试过写 if (x is null)?它与 if (x == null) 相比,孰优孰劣呢? x is null 还有 x is constant 是 C# 7.0 中引入的模式匹配(Pattern Matching)中的一个小细节。阅读本文将了解 x is constant 和 x == con 阅读全文
posted @ 2017-11-06 23:21 walterlv 阅读(2343) 评论(4) 推荐(1) 编辑
摘要: 无论是 WPF 还是 UWP 开发,如果用 Storyboard 和 Animation 做动画,我们多数时候都会设置 From 和 To 属性,用于从起始值动画到目标值。然而动画并不总是可以静态地指定这些值,因为更多的时候动画的起始值和目标值取决于当前 UI 的状态。 本文中,我将将尽量避免设置 阅读全文
posted @ 2017-10-31 16:19 walterlv 阅读(305) 评论(0) 推荐(0) 编辑
摘要: WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验。如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程。然而,就不能让同一个窗口内部使用多个 UI 线程吗? 答案其实是——可以的!使用 VisualTarget 即可。 阅读全文
posted @ 2017-10-30 23:55 walterlv 阅读(1072) 评论(0) 推荐(0) 编辑
摘要: .NET 和 C# 共同给我们带来的 async/await 异步编程模型(TAP)用起来真的很爽。为了实现异步等待,我们只需要在一切能够能够异步等待的方法前面加上 await 即可。能够异步等待的最常见的类型莫过于 Task,但也有一些其他类型。即便有些耗时操作没有返回可等待的类型,我们也可以用一 阅读全文
posted @ 2017-10-29 20:42 walterlv 阅读(2722) 评论(1) 推荐(2) 编辑
摘要: 最近读到一篇异步转同步的文章,发现其中没有考虑到异步转同步过程中发生的死锁问题,所以特地在本文说说异步转同步过程中的死锁问题。 文章作者 林德熙 已经修复了描述: - win10 uwp 异步转同步 什么情况下会产生死锁? 调用 Task.Wait() 或者 Task.Result 立刻产生死锁的充 阅读全文
posted @ 2017-10-28 00:00 walterlv 阅读(731) 评论(0) 推荐(0) 编辑
摘要: 当你跑起了一个异步线程,并用 await 异步等待时,有没有好奇为什么能够在主线程 catch 到异步线程的异常? 当你希望在代码中提前收集好异常,最后一并把收集到的异常抛出的时候,能不能做到就像在原始异常发生的地方抛出一样? 本文介绍 ExceptionDispatchInfo,专门用于重新抛出异 阅读全文
posted @ 2017-10-23 22:33 walterlv 阅读(1035) 评论(1) 推荐(2) 编辑
摘要: 在 WPF 中,如果我们要做拖动效果,通常会调用一下 CaptureMouse/CaptureStylus 以便当鼠标或手指离开控件的时候依然能够响应 Move 和 Up 事件。不知有没有注意到这两个函数其实是有 bool 返回值的?——是的,它们可能会失败。 在调试一个项目代码的时候,我就发现了这 阅读全文
posted @ 2017-10-21 16:36 walterlv 阅读(197) 评论(0) 推荐(1) 编辑
摘要: 如果你的程序抛了异常,你是怎么处理的呢?等待程序崩溃退出?还是进行补救? 如果是做 UI 开发,很容易就找到 Dispatcher.UnhandledException 事件,然后在事件中进行补救。如果补救成功,可以设置 e.Handled = true 来阻止异常继续让程序崩溃退出。但是,如果是后 阅读全文
posted @ 2017-10-21 16:32 walterlv 阅读(1708) 评论(0) 推荐(0) 编辑
摘要: Yield 这个词很有意思,叫做“屈服”“放弃”“让步”,字面意义上是让出当前任务的执行权,转而让其他任务可以插入执行。Task、Dispatcher、Thread 都有 Yield() 方法,看起来都可以让出当前任务的执行权。 如果在阅读中发现对本文涉及到的一些概念不太明白,可以阅读: 深入了解 阅读全文
posted @ 2017-10-21 16:30 walterlv 阅读(295) 评论(0) 推荐(1) 编辑
摘要: 希望写一个小型工具,给自己和需要的人。考虑到代码尽可能的复用,我准备采用 .Net Standard 来编写大多数核心代码,并基于 .Net Core 编写跨平台控制台入口,用 WPF 编写桌面端 UI 入口,用 UWP 作为可上架商店的 UI 入口,然后用 Shared Project 共享 WP 阅读全文
posted @ 2017-10-21 16:27 walterlv 阅读(342) 评论(0) 推荐(0) 编辑
摘要: 无论是 WPF,还是 UWP,只要你用了绑定或者标记扩展,一定会碰到一个神奇的值——DependencyProperty.UnsetValue。UnsetValue 是什么意思?为什么会出现这个值呢?如果要让 UnsetValue 为我们所用,正确的用法又是什么呢? DependencyProper 阅读全文
posted @ 2017-10-11 00:06 walterlv 阅读(2092) 评论(0) 推荐(3) 编辑
摘要: 在上一篇文章 深入了解 WPF Dispatcher 的工作原理(Invoke/InvokeAsync 部分) 中我们发现 Dispatcher.Invoke 方法内部是靠 Dispatcher.PushFrame 来确保“不阻塞地等待”的。然而它是怎么做到... 阅读全文
posted @ 2017-09-26 12:26 walterlv 阅读(727) 评论(0) 推荐(0) 编辑
摘要: 深耕 WPF 开发的各位程序员大大们一定避不开使用 Dispatcher。跨线程访问 UI 当然免不了用到它,将某个任务延迟到当前任务之后执行也会用到它。Dispatcher.Invoke、Dispatcher.BeginInvoke 是过去大家经常使用的方... 阅读全文
posted @ 2017-09-26 12:21 walterlv 阅读(1384) 评论(0) 推荐(0) 编辑
摘要: 在开发 markdown-mail 时遇到了一些诡异的情况。代码是这么写的:然而在 TextChanged 事件之后延时执行了一些操作时,从 ViewModel 里拿到的值却始终是旧的。阅读本文将了解其原因和解决办法。无论是 WPF 还是 UWP,Bindi... 阅读全文
posted @ 2017-09-25 01:24 walterlv 阅读(578) 评论(0) 推荐(0) 编辑
摘要: 古老的 Win32 应用启动其他程序太过方便,以至于一部分开发者都已经不记得 Windows 能通过关联协议的方式通过统一资源定位符(URI)来启动应用程序了。转到 UWP 后,使用 URI 启动应用似乎成为了最推荐的方式。于是一句 LaunchUriAsy... 阅读全文
posted @ 2017-09-25 00:45 walterlv 阅读(431) 评论(0) 推荐(0) 编辑
摘要: 跟图片打交道的 UWP 应用或多或少都会遇到图片带来的性能问题,就算不主要处理图片,做个论坛做个新闻客户端都涉及到大量图片。一个帖子、一篇文章里多半都是些高清大图,这些图片一张即可占用程序 1~2M 的内存空间。普通的写法内存很快就爆了,那么 UWP 中我们... 阅读全文
posted @ 2017-09-23 00:04 walterlv 阅读(281) 评论(0) 推荐(0) 编辑
摘要: 当我们编译程序目标框架选为 .Net Framework 4.5/4.6/4.7 时,CLR 运行时是如何判断我们究竟应该用哪一个 .Net Framework 呢?.Net Framework 的版本到底由哪些部分组成?我们编译 .Net Framewor... 阅读全文
posted @ 2017-09-22 21:50 walterlv 阅读(682) 评论(1) 推荐(0) 编辑
摘要: 微软在 Reference Source 里开放了 .Net Framework 多个版本的源码。为了更方便地阅读这些源码,我们把每一个版本都下载下来后按顺序提交到 git 仓库中。但是!!!居然忘了在第一次提交之前放一个 .gitignore 文件!如果没... 阅读全文
posted @ 2017-09-14 23:57 walterlv 阅读(640) 评论(0) 推荐(0) 编辑
摘要: 不管在 32 位 Windows 上还是在 64 位 Windows 上,32 位的应用程序都只能使用最大 2GB 的内存,这是我们司空见惯的一个设定。但其实 Windows 提供了一些方法让我们打破这样的设定,使程序使用大于 2GB 的内存。阅读本文,你将... 阅读全文
posted @ 2017-09-14 23:55 walterlv 阅读(1973) 评论(0) 推荐(0) 编辑
摘要: 我们抛出异常是为了知道程序中目前的状态发生了错误。为了能够知道错误的详细信息便于我们将来避免产生这样的错误,我们会选用合适的异常类型,在异常中编写易于理解的 message 信息。但是有时我们需要更多的信息进行调试才能帮忙在将来避免这个异常。System.E... 阅读全文
posted @ 2017-09-14 23:53 walterlv 阅读(330) 评论(0) 推荐(0) 编辑
摘要: WPF 自诞生以来就带着微软先生的傲慢。微软说 WPF 支持触摸,于是 WPF 就真的支持触摸了。对,我说的是“支持触摸”,那种摸上去能点能动的;偶尔还能带点儿多指的炫酷效果。但是,WPF 推出那会儿,绝大部分开发者都还没有触摸屏呢,开发个程序要怎么验证支不... 阅读全文
posted @ 2017-09-14 23:52 walterlv 阅读(987) 评论(1) 推荐(0) 编辑