随笔分类 -  C#

C#
摘要:当我们为一个委托写 -= 的时候,ReSharper 会提示“Delegate Subtraction Has Unpredictable Result”,即“委托的减法可能出现非预期的结果”。然而在写为事件写 -= 的时候却并没有这样的提示。然而这个提示是什么意思呢?为什么会“非预期”?为什么委托 阅读全文
posted @ 2017-12-30 10:56 walterlv 阅读(319) 评论(0) 推荐(0) 编辑
摘要:WPF 的 ScrollViewer 没有水平滚动和垂直滚动的属性 HorizontalScrollOffset VerticalScrollOffset,只有水平滚动和垂直滚动的方法 ScrollToHorizontalOffset ScrollToVerticalOffset,那么怎么给滚动过程 阅读全文
posted @ 2017-12-20 23:24 walterlv 阅读(675) 评论(0) 推荐(0) 编辑
摘要:此前有小伙伴询问我为何他 1 像素的线条显示发虚,然后我告诉他是“像素对齐”的问题,然而他设置了各种对齐像素的属性依旧没有作用。于是我对此进行了一系列试验,对 WPF 像素对齐的各种方法进行了一次总结。此后在 StackOverflow 中,我回答了 graphics - WPF DrawingCo 阅读全文
posted @ 2017-12-20 23:22 walterlv 阅读(917) 评论(0) 推荐(1) 编辑
摘要:背景色千差万别,如果希望在这样复杂的背景色下显示清晰可辨的前景色(例如显示文字),那如何选择这样的前景色才能确保适用于所有的背景呢? 灰度图的心理学公式 红绿蓝三色是非常不直观的颜色表示的方法,如果不经过训练,人类几乎没有办法直接通过 RGB 的值来猜出大概的颜色来。而 HSB 是用来解决人眼感知问 阅读全文
posted @ 2017-11-30 01:43 walterlv 阅读(642) 评论(0) 推荐(0) 编辑
摘要:这篇文章不会说 MVVM 是什么,因为讲这个的文章太多了;也不会说 MVVM 的好处,因为这样的文章也是一搜一大把。我只是想说说我们究竟应该如何理解 M-V-VM,当我们真正开始写代码时,应该在里面的每一层里写些什么。 MVVM,当然三层——M-V-VM。就凭这个“三层”结构,WPF/UWP 开发者 阅读全文
posted @ 2017-11-30 01:33 walterlv 阅读(1183) 评论(0) 推荐(0) 编辑
摘要:如果要你说出 .NET 中的三个异常,NullReferenceException 一定会成为其中一个;如果说出 .NET 中的一个异常,NullReferenceException 也会被大多数人说出来。它让这么多人印象深刻,是因为它在项目中实在是太常见了,常见到每一个 C#/.NET 入门者必然 阅读全文
posted @ 2017-11-30 01:32 walterlv 阅读(524) 评论(0) 推荐(0) 编辑
摘要:WPF/UWP 中提供的 Path 类可以为我们绘制几乎所有可能的矢量图形。但是,如果这些矢量图形可以以动画的形式播放出来,那将可以得到非常炫酷的演示效果。 我用 Blend 画了我的名字: 然后将它做成了动画: 而要做到这一点,我们只需要关心 Path 的两个属性即可: StrokeDashArr 阅读全文
posted @ 2017-11-23 22:37 walterlv 阅读(524) 评论(0) 推荐(0) 编辑
摘要:为自己写的程序添加插件真的是一个相当常见的功能,然而如果只是简单加载程序集然后去执行程序集中的代码,会让宿主应用程序暴露在非常危险的境地!因为只要插件能够运行任何一行代码,就能将宿主应用程序修改得天翻地覆哭爹喊娘;而根本原因,就在于暴露了整个托管堆和整个 UI 树。 如果将宿主和插件放到不同的应用程 阅读全文
posted @ 2017-11-23 22:18 walterlv 阅读(599) 评论(0) 推荐(0) 编辑
摘要:在 WPF 或 UWP 中,我们平时开发所遇到的那些 UI 控件或组件,都直接或间接继承自 Framework。例如:Grid、StackPanel、Canvas、Border、Image、Button、Slider。我们总会自然而然地认为这些控件都是有大小的,它们会在合适的位置显示自己,通常不会超 阅读全文
posted @ 2017-11-23 22:16 walterlv 阅读(302) 评论(0) 推荐(0) 编辑
摘要:在 WPF 中将一个现成的 Bitmap 位图转换成 ImageSource 用于显示一个麻烦的事儿,因为 WPF 并没有提供多少可以转过来的方法。不过产生 Bitmap 来源却非常多,比如屏幕截图、GDI 图、数组或其它非托管框架生成的图片。 WPF 官方提供了一种方法,使用 System.Win 阅读全文
posted @ 2017-11-23 22:15 walterlv 阅读(379) 评论(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 阅读(2395) 评论(4) 推荐(1) 编辑
摘要:无论是 WPF 还是 UWP 开发,如果用 Storyboard 和 Animation 做动画,我们多数时候都会设置 From 和 To 属性,用于从起始值动画到目标值。然而动画并不总是可以静态地指定这些值,因为更多的时候动画的起始值和目标值取决于当前 UI 的状态。 本文中,我将将尽量避免设置 阅读全文
posted @ 2017-10-31 16:19 walterlv 阅读(313) 评论(0) 推荐(0) 编辑
摘要:WPF 的 UI 逻辑只在同一个线程中,这是学习 WPF 开发中大家几乎都会学习到的经验。如果希望做不同线程的 UI,大家也会想到使用另一个窗口来实现,让每个窗口拥有自己的 UI 线程。然而,就不能让同一个窗口内部使用多个 UI 线程吗? 答案其实是——可以的!使用 VisualTarget 即可。 阅读全文
posted @ 2017-10-30 23:55 walterlv 阅读(1275) 评论(0) 推荐(0) 编辑
摘要:.NET 和 C# 共同给我们带来的 async/await 异步编程模型(TAP)用起来真的很爽。为了实现异步等待,我们只需要在一切能够能够异步等待的方法前面加上 await 即可。能够异步等待的最常见的类型莫过于 Task,但也有一些其他类型。即便有些耗时操作没有返回可等待的类型,我们也可以用一 阅读全文
posted @ 2017-10-29 20:42 walterlv 阅读(3051) 评论(1) 推荐(2) 编辑
摘要:最近读到一篇异步转同步的文章,发现其中没有考虑到异步转同步过程中发生的死锁问题,所以特地在本文说说异步转同步过程中的死锁问题。 文章作者 林德熙 已经修复了描述: - win10 uwp 异步转同步 什么情况下会产生死锁? 调用 Task.Wait() 或者 Task.Result 立刻产生死锁的充 阅读全文
posted @ 2017-10-28 00:00 walterlv 阅读(776) 评论(0) 推荐(0) 编辑
摘要:当你跑起了一个异步线程,并用 await 异步等待时,有没有好奇为什么能够在主线程 catch 到异步线程的异常? 当你希望在代码中提前收集好异常,最后一并把收集到的异常抛出的时候,能不能做到就像在原始异常发生的地方抛出一样? 本文介绍 ExceptionDispatchInfo,专门用于重新抛出异 阅读全文
posted @ 2017-10-23 22:33 walterlv 阅读(1096) 评论(1) 推荐(2) 编辑
摘要:在 WPF 中,如果我们要做拖动效果,通常会调用一下 CaptureMouse/CaptureStylus 以便当鼠标或手指离开控件的时候依然能够响应 Move 和 Up 事件。不知有没有注意到这两个函数其实是有 bool 返回值的?——是的,它们可能会失败。 在调试一个项目代码的时候,我就发现了这 阅读全文
posted @ 2017-10-21 16:36 walterlv 阅读(202) 评论(0) 推荐(1) 编辑
摘要:Yield 这个词很有意思,叫做“屈服”“放弃”“让步”,字面意义上是让出当前任务的执行权,转而让其他任务可以插入执行。Task、Dispatcher、Thread 都有 Yield() 方法,看起来都可以让出当前任务的执行权。 如果在阅读中发现对本文涉及到的一些概念不太明白,可以阅读: 深入了解 阅读全文
posted @ 2017-10-21 16:30 walterlv 阅读(321) 评论(0) 推荐(1) 编辑
摘要:希望写一个小型工具,给自己和需要的人。考虑到代码尽可能的复用,我准备采用 .Net Standard 来编写大多数核心代码,并基于 .Net Core 编写跨平台控制台入口,用 WPF 编写桌面端 UI 入口,用 UWP 作为可上架商店的 UI 入口,然后用 Shared Project 共享 WP 阅读全文
posted @ 2017-10-21 16:27 walterlv 阅读(355) 评论(0) 推荐(0) 编辑
摘要:本文代码基于 .NET Framework 实现。 本来只想进行简单的配置存储的,不料发现 .NET 的基本类型多达十多种。于是,如果写成下面这样,那代码可就太多了哦: 尝试使用泛型 这些方法都比较相似,于是自然而然想到了泛型,所以写出了这段代码: 这里就郁闷了,因为虽然方法内部的实现都长得差不多, 阅读全文
posted @ 2017-01-17 18:12 walterlv 阅读(3246) 评论(3) 推荐(3) 编辑