取消

WPF/UWP 绑定中的 UpdateSourceTrigger

在开发 markdown-mail 时遇到了一些诡异的情况。代码是这么写的: <TextBox Text="{Binding Text, Mode=TwoWay}"/> 然而在 TextChanged 事件之后延时执行了一些操作时,从 ViewModel 里拿到的值却始终是旧的。 阅读本文将了解其原因和解决办法。 无论是 WPF 还是 UWP,Binding 中都有...

用微软拼音快速输入自定义格式的时间和日期

用微软拼音输入 rq 或者 sj,我们可以在第五个候选词分别得到 2017年9月18日 和 22点05分。但是,其实我想输入的是:2017-09-18 和 2017-09-18 22:05:51 +0800。在设置里面折腾一番没找到之后,原本以为只好自己输入了,没想到后面还是找到了方法。 我不会告诉你我要一个这样的日期是为了写这篇博客的时候能方便地填写编辑时间…… 效果 这是我们平...

在 Visual Studio 中使用 EditorConfig 统一代码风格(含原生与插件)

EditorConfig 是一种被各种编辑器广泛支持的配置,使用此配置有助于项目在整个团队中保持一致的代码风格。Visual Studio 2017 开始原生支持 EditorConfig。 本文将介绍 Visual Studio 对 EditorConfig 的支持情况(含原生与插件),并给出符合 .NET 和 C# 约定的 EditorConfig 详细设置。 EditorC...

使用 Windows 10 中的加速度计(Accelerometer,重力传感器)

在做 UWP 应用开发的时候还有什么理由可以用到加速度计呢?场景很多啦,比如做游戏,做类似 Surface Hub 那种一边旋转,一边所有内容跟着一起转的效果。 Windows 10 UWP 中的加速度计使用非常简单,只需要简单几句代码即可。 重力迷宫游戏 这里有一个利用加速度计的好玩的例子: ▲ 用 Lumia 950XL 玩重力迷宫 画质太渣了?确实太渣了。那就看看桌...

.NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)

我们有很多种方法评估一个方法的执行耗时,比如使用性能分析工具,使用基准性能测试。不过传统的在代码中编写计时的方式依然有效,因为它可以生产环境或用户端得到真实环境下的执行耗时。 如果你希望在 .NET/C# 代码中编写计时,那么阅读本文可以获得一些建议。阅读本文也可以了解到 QueryPerformanceCounter、Get­System­Time­As­File­Time 等方法的差异...

.NET/C# 反射的的性能数据,以及高性能开发建议(反射获取 Attribute 和反射调用方法)

大家都说反射耗性能,但是到底有多耗性能,哪些反射方法更耗性能;这些问题却没有统一的描述。 本文将用数据说明反射各个方法和替代方法的性能差异,并提供一些反射代码的编写建议。为了解决反射的性能问题,你可以遵循本文采用的各种方案。 反射各方法的性能数据 我使用 BenchmarkDotNet 基准性能测试来评估反射各个方法的性能。测试的程序基于 .NET Core 2.1 开发。 ...

.NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)

不知你是否见过 try { } finally { } 代码中,try 块留空,而只往 finally 中写代码的情况呢?这种写法有其特殊的目的。 本文就来说说这种不一样的写法。 空的 try 块 你可以点开这个链接查看 Exception 类,在里面你可以看到一段异常处理的代码非常奇怪: // 代码已经过简化。 internal void RestoreExceptionD...

C# 重载条件逻辑运算符(&& 和 ||)

在微软的官方文档中,规定 && 和 || 运算符不可被重载,但允许通过重载 &、|、true 和 false 实现间接重载。 本文将介绍重载方法和原理。感谢 Opportunity 的指导。 条件逻辑运算符是可以重载的 在微软的官方文档 true Operator (C# Reference) - Microsoft Docs 中,解释了 &&a...

在 WPF 中使用 x:Reference

x:Reference 是 XAML 2009 中引入的功能,也算是比较早的功能了;ElementName 是 XAML 一开始出现便开始有的功能。二者在使用时在感觉上是比较相似的,但多数情况下都更有优势。 本文将解释 x:Reference。 典型的使用 x:Reference 的例子是: <object property="{x:Reference instancexNa...

UWP 轻量级样式定义(Lightweight Styling)

在 UWP 中,可以通过给控件直接设置属性或在 Style 中设置属性来定制控件的样式;不过这样的样式定义十分有限,比如按钮按下时的样式就没法儿设置。当然可以通过修改 Template 来设置控件的样式,然而 UWP 中控件的样式代码实在是太多太复杂了,还不容易从 Blend 中复制了大量代码出来改,下个版本样式又不一样,于是我们就丢了不少功能。 本文将介绍 UWP 轻量级样式定义(Lig...

UWP 中的各种文件路径(用户、缓存、漫游、安装……)

UWP 提供了多种不同文件路径访问方式,对应到不同的文件路径中。可能我们只是简单用 ApplicationData.Current 获取一下可以读写的路径便能应付我们应用日常所需的各种文件读写需求,不过,UWP 还提供了更多的路径选项。 本文将和你一起总结 UWP 中的各种各样的路径。 UWP 中的路径种类 UWP 中可访问的路径有这些: ApplicationData...

C# 空合并操作符(??)不可重载?其实有黑科技可以间接重载!

?? 操作符叫做 null-coalescing operator,即 null 合并运算符。如果此运算符的左操作数不为 null,则此运算符将返回左操作数;否则返回右操作数。 在微软的官方 C# 文档中,此操作符被定义为不可重载。不过我们有方法可以间接实现这样的重载。 运算符重载 你可以阅读 C# 中那些可以被重载的操作符,以及使用它们的那些丧心病狂的语法糖 了解 C# 中提...

让控制台支持 ANSI 转义序列,输出下划线、修改颜色或其他控制

各种操作系统的控制台都支持 ANSI 转义序列(ANSI Escape Code)。使用转义序列,可以对控制台进行很多额外的定制,例如修改颜色、修改标题栏,将文字添加下划线等。 当然,.NET 已经帮助我们封装了很大的一部分功能了,我们重点可以放在 .NET 没有封装的那部分上。 基本的准备代码 在开始之前,我们先添加一些基础性代码,这是对系统核心功能的调用。 const i...

UWP 应用中 CoreApplication / Application, CoreWindow / Window 之间的区别

在 StackOverflow 上看到有小伙伴询问 CoreApplication, CoreApplicationView, Application, ApplicationView, CoreWindow, Window 它们的含义以及它们之间的区别。 于是我整理了这篇文章。 This post is written in multiple languages. Please s...

UWP CoreApplication / Application Vs CoreApplicationView / ApplicationView Vs CoreWindow / Window

I find a question on Stack Overflow CoreApplicationView vs CoreWindow vs ApplicationView, so I write this post for the answer. This post is written in multiple languages. Please select yours: ...

UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项

在 Windows 10 的前几个版本中将页面内容扩展到标题栏上还算简单,主要是没什么坑。直到一些新控件的引入和一些外观设计趋势变化之后,扩展标题栏开始出现一些坑了。 本文将重温 UWP 自定义标题栏或者扩展标题栏的方法,但更重要的是解决一些坑。 扩展/自定义标题栏 要扩展标题栏,只需要拿到 CoreApplicationView 的实例,然后设置 TitleBar 的 Ext...

理解 UWP 视图的概念,让 UWP 应用显示多个窗口(多视图)

UWP 应用多是一个窗口完成所有业务的,事实上我也推荐使用这种单一窗口的方式。不过,总有一些特别的情况下我们需要用到不止一个窗口,那么 UWP 中如何使用多窗口呢? 为什么 UWP 需要多窗口? 多窗口在传统 Win32 的开发当中是司空见惯的事儿了,不过我个人非常不喜欢,因为 Windows 系统上的多窗口太多坑。以下是我以前写的关于传统多窗口开发中的一些坑(除此之外还有更多)...

(2/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序

每次使用 Visual Studio 的模板创建一个 UWP 程序,我们会在项目中发现大量的项目文件、配置、应用启动流程代码和界面代码。然而这些文件在 UWP 程序中到底是如何工作起来的? 我从零开始创建了一个 UWP 程序,用于探索这些文件的用途,了解 UWP 程序的启动流程。 本文分为两个部分: 从零开始创建一个 UWP 项目并完成部署 从零开始编写一个 UWP 应用...

.NET/C# 使窗口永不激活(No Activate 永不获得焦点)

有些窗口天生就是为了辅助其它程序而使用的,典型的如“输入法窗口”。这些窗口不希望抢夺其它窗口的焦点。 有 Win32 方法来解决这样的问题,WS_EX_NOACTIVATE 便是关键。 具体来说,是给窗口样式中额外添加一个 WS_EX_NOACTIVATE 位。 var handle = GetTheWindowHandle(); int exstyle = GetWindowLo...

使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越实在太久远,兼容性依然是避不开的问题。Microsoft.UI.Xaml 的预览版现已推出,旨在解决 UWP UI 控件在各个不同版本 Windows 上的兼容性问题。 本文将简单了解一下 Microsoft.UI.Xaml 库,然后实际看看它的效果。 Windows 10 的兼容性问题 在创...

Windows 10 应用创建模糊背景窗口的三种方法

现代的操作系统中创建一张图片的高斯模糊效果非常容易,不过如果要在窗口中获得模糊支持就需要操作系统的原生支持了。iOS/Mac 和 Windows 系统都对此有支持。 本文将介绍三种创建模糊背景窗口的方法。有人可能喜欢称之为毛玻璃窗口、亚克力窗口。 This post is written in multiple languages. Please select yours: ...

3 Ways to create a window with blurring background on Windows 10

This post is an answer from Stack Overflow and introduce some methods to create a window with blurring background. This post is written in multiple languages. Please select yours: ...

长期支持 LTS(Long-term Support)是怎样的一种支持方式

在 .NET Core 2.1 发布之时,微软称之为一个 LTS 版本,那么 LTS 的版本是一种怎样的版本呢? LTS 这是 .NET Core 2.1 的发布博客:Announcing .NET Core 2.1 - .NET Blog;文中说: .NET Core 2.1 will be a long-term support (LTS) release. This...

在制作跨平台的 NuGet 工具包时,如何将工具(exe/dll)的所有依赖一并放入包中

NuGet 提供了工具类型的包支持,生成一个基于 .NET Core 的 dll 或者基于 .NET Framework 的 exe 之后,你几乎可以对项目做任何事情。但是,默认情况下,NuGet 不会将这些工具的依赖一起打包进入 NuGet 包 nupkg 文件内,这就使得功能比较复杂的跨平台 NuGet 工具包几乎是无法正常工作的。 本文将介绍将这些依赖加入 NuGet 包中的方法,使...

使用 LINQ to XML,.NET 让生成 XML 文件变得和直接写 XML 一样轻松

由 .NET Framework 3.5 引入,并依然在 .NET Core 中发扬光大的 LINQ to XML 让编写 XML 文件变得非常轻松。 使用 XElement、XAttribute 我们能够完整构造一个 XML 出来。为了能直观地体会到优势,我写一个最简单的例子: var root = new XElement("Root", new XAttribute("...

PasswordVault —— 在 UWP 应用中安全地保存密码

只要你做过自动登录,一定会遇到密码的安全问题。现在大部分的网络服务都已经支持 Token 了,有些已经支持 OAuth2.0,这意味着客户端不怎么需要关心密码的安全保存问题。 但是,依然还有一些古老的服务和协议需要直接传输密码,比如邮件的 IMAP 协议。 我在 ERMail 应用的开发中就遇到了这样的问题,作为一款邮件客户端,IMAP 协议下的自动登录依然要在用户的本地保存密码。 ...

Windows 10 四月更新,文件夹名称也能区分大小写了

Linux 一向都是区分文件和文件夹大小写的。Mac OS 默认不区分文件和文件夹大小写,不过可以配置成支持。而 Windows 向来是不区分文件和文件夹大小写的,但是从 NTFS 开始却又支持区分文件夹大小写。 本文将介绍 Windows 10 四月更新带来的新特性 —— 让文件夹名称也能区分大小写。 问题 本来文件系统是否区分大小写只是单纯风格上的差异,并没有孰优孰劣,但这...

如何使用 MSBuild Target(Exec)中的控制台输出

我曾经写过一篇文章 如何创建一个基于命令行工具的跨平台的 NuGet 工具包,通过编写一个控制台程序来参与编译过程。但是,相比于 基于 Task 的方式,可控制的因素还是太少了。 有没有什么办法能够让控制台程序也能与 MSBuild Target 之间发生更多的信息交换呢?答案是有的,通过捕获控制台的输出! 捕获控制台输出 如果你喜爱阅读文档,那么答案已经不陌生了,在微软的官方...

微软 Windows 系统检测网络连通性(用于显示感叹号)竟然是通过访问一个特殊网址来实现的

一次我走到了弱网环境中,意外地发现浏览器打开了 http://www.msftconnecttest.com/redirect 网址,随后右下角的网络图标出现了一枚“感叹号”。 吹水的推断 从直观看来,这个网址的连通性和网络图标上的“感叹号”有着直接的联系。那么到底有没有联系呢?于是去知乎上看看,发现了专业造轮子拉黑抢前排的轮子哥的回复。 vczh 专业造轮子,拉黑抢前排...

如何编写 WPF 的标记扩展 MarkupExtension,即便在 ControlTemplate/DataTemplate 中也能生效

WPF 的标记扩展为 WPF 带来了强大的扩展性。利用自定义的标记扩展,我们能够为 XAML 中的属性提供各种各样种类的值,而不仅限于自带的那一些。 不过有小伙伴发现在 ControlTemplate 或 DataTemplate 中编写标记扩展有时并不能正常工作,而本文将提供解决方法。 本文并不会详细讲解如何编写 WPF 的标记扩展,如果你想了解相关的知识,建议阅读官网:Marku...