walterlv

吕毅 - Windows 10 Developer

吕毅 - walterlv


将 UWP 的有效像素(Effective Pixels)引入 WPF

吕毅 更新于 2017-11-14 12:49,发布于 2017-11-14 11:26

在很久很久以前,WPF 诞生之初,有一个神奇的单位,它的名字叫做——设备无关单位(DIP,Device Independent Unit)。微软给它描绘了一片美好的愿景——在任何显示器上显示的尺寸是相同的。

What the ** is this unit!!! 神 TM 相同!!!

UWP 采用有效像素(Effective Pixels)来描述尺寸,这是才是能够自圆其说的一套尺寸描述;WPF 的尺寸机制与 UWP 完全就是同一套,使用有效像素才能解释 WPF 尺寸变化上的各种特性!

为修改了链接地址的博客进行重定向

吕毅 发布于 2017-11-14 01:05

不同于笔记,博客除了给自己带来知识的积累之外,还将知识和思想分享给了互联网上的同道中人。

于是,当我不得不修改博客地址的时候,就不得不考虑地址修改的兼容问题。

Visual->UIElement->FrameworkElement,带来更多功能的同时也带来了更多的限制

吕毅 发布于 2017-11-13 23:55

在 WPF 或 UWP 中,我们平时开发所遇到的那些 UI 控件或组件,都直接或间接继承自 Framework。例如:GridStackPanelCanvasBorderImageButtonSlider。我们总会自然而然地认为这些控件都是有大小的,它们会在合适的位置显示自己,通常不会超出去。但是,FrameworkElement 甚至是 Control 用得久了,都开始忘记 VisualUIElement 带给我们的那些自由。

阅读本文将了解我们熟知的那些功能以及限制的由来,让我们站在限制之外再来审视 WPF 的可视化树,再来看清 WPF 各种控件属性的本质。

WPF 跨应用程序域的 UI(Cross AppDomain UI)

吕毅 更新于 2017-11-13 23:04,发布于 2017-11-13 00:36

为自己写的程序添加插件真的是一个相当常见的功能,然而如果只是简单加载程序集然后去执行程序集中的代码,会让宿主应用程序暴露在非常危险的境地!因为只要插件能够运行任何一行代码,就能将宿主应用程序修改得天翻地覆哭爹喊娘;而根本原因,就在于暴露了整个托管堆和整个 UI 树。

如果将宿主和插件放到不同的应用程序域中,则可以解决此问题。本文将介绍跨应用程序域承载 UI 的方法,其中也包含跨域(Cross-Domain)调用方法。

使用不安全代码将 Bitmap 位图转为 WPF 的 ImageSource 以获得高性能和持续小的内存占用

吕毅 更新于 2017-11-10 14:42,发布于 2017-11-09 23:25

在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法。不过产生 Bitmap 来源却非常多,比如屏幕截图、GDI 图、数组或其它非托管框架生成的图片。

如何在单元测试中使用 Dispatcher.Invoke/InvokeAsync?

吕毅 发布于 2017-11-07 21:02

对于部分涉及到 WPF UI 的部分,单元测试一般都难以进行。但是,如果只是使用到其中的 UI 线程调度,那就稍微容易一些。不过为了找到这个方法我做了很多天的尝试。

本文将提供一种在单元测试中运行 Dispatcher 的方法,以便能够在单元测试中测试到 Invoke/InvokeAsync 是否按要求执行。

Visual Studio 也开始支持 Ctrl 点击跳转了,于是需要解决跟 ReSharper 的冲突

吕毅 发布于 2017-11-07 15:55

微软在 2017年10月9日 发布了 Visual Studio 2017 version 15.4.0。而这个版本带来了大家期待已久的 Ctrl+Click 跳转到定义的功能。然而……ReSharper 也是这样的快捷键,也是这样的功能!!!

居然冲突了啊,怎么办?

从 “x is null 和 x == null” 的区别看 C# 7 模式匹配中常量和 null 的匹配

吕毅 更新于 2017-11-06 23:29,发布于 2017-11-06 23:24

尝试过写 if (x is null)?它与 if (x == null) 相比,孰优孰劣呢?

x is null 还有 x is constant 是 C# 7.0 中引入的模式匹配(Pattern Matching)中的一个小细节。阅读本文将了解 x is constantx == constant 之间的差别,并给出一些代码编写建议。

分享一个算法,计算能在任何背景色上清晰显示的前景色

吕毅 更新于 2017-11-05 16:24,发布于 2017-11-04 22:51

背景色千差万别,如果希望在这样复杂的背景色下显示清晰可辨的前景色(例如显示文字),那如何选择这样的前景色才能确保适用于所有的背景呢?

修复 WPF 窗口在启动期间短暂的白底显示

吕毅 发布于 2017-11-03 23:08

不管你做的 WPF 窗口做得多么简单,是否总感觉启动的那一瞬间窗口内是白白的一片?是否试过无数偏方黑科技,但始终无法解决?

本文将介绍一种简单的方法来彻底解决这个问题。

WPF 同一窗口内的多线程 UI(VisualTarget)

吕毅 发布于 2017-10-30 23:38

WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验。如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程。然而,就不能让同一个窗口内部使用多个 UI 线程吗?

答案其实是——可以的!使用 VisualTarget 即可。

阅读本文将收获一份对 VisualTarget 的解读以及一份我封装好的跨线程 UI 控件 DispatcherContainer.cs

如何实现一个可以用 await 异步等待的 Awaiter

吕毅 更新于 2017-10-30 22:01,发布于 2017-10-29 16:38

.NET 和 C# 共同给我们带来的 async/await 异步编程模型(TAP)用起来真的很爽。为了实现异步等待,我们只需要在一切能够能够异步等待的方法前面加上 await 即可。能够异步等待的最常见的类型莫过于 Task,但也有一些其他类型。即便有些耗时操作没有返回可等待的类型,我们也可以用一句 Task.Run(action) 来包装(同步转异步 - 林德熙 中也有说明);不过副作用就是 Run 里面的方法在后台线程执行了(谁知道这是好处呢还是坏处呢 ^_^)。

问题就在于,有些“耗时”操作根本就无法放入后台线程,典型的莫过于“耗时”的 UI 操作。本文将通过实现一个适用于 UI 的可等待类型来解决这种 UI 的“耗时”等待问题。

使用 Task.Wait()?立刻死锁(deadlock)

吕毅 更新于 2017-10-28 13:10,发布于 2017-10-27 23:54

最近读到一篇异步转同步的文章,发现其中没有考虑到异步转同步过程中发生的死锁问题,所以特地在本文说说异步转同步过程中的死锁问题。

为 Web 页面添加 iPhone 固定标签页的图标

吕毅 发布于 2017-10-28 00:16

我曾经将一个 Web 标签页固定到 iPhone 的主屏幕上,发现居然有一个图标。当时没有留意,可直到今天发现我的博客页面在我的 iPhone 主屏幕上显示一片空白后,才想起来原来还可以自定义图标。

使用 ExceptionDispatchInfo 捕捉并重新抛出异常

吕毅 更新于 2017-10-27 07:38,发布于 2017-10-23 22:22

当你跑起了一个异步线程,并用 await 异步等待时,有没有好奇为什么能够在主线程 catch 到异步线程的异常?

当你希望在代码中提前收集好异常,最后一并把收集到的异常抛出的时候,能不能做到就像在原始异常发生的地方抛出一样?

本文介绍 ExceptionDispatchInfo,专门用于重新抛出异常。它在 .NET Framework 4.5 中首次引入,并原生在 .NET Core 和 .NET Standard 中得到支持。