09 2022 档案

摘要:本文告诉大家如何修复 WPF 的 ContextMenu 在开启 PerMonitorV2 之后,在双屏不同的 DPI 的设备上,在副屏弹出的 ContextMenu 使用了主屏的 DPI 导致缩放错误的问题 阅读全文
posted @ 2022-09-29 08:13 lindexi 阅读(164) 评论(0) 推荐(0)
摘要:WPF 切换主题使用 luna 复古版本本文告诉大家如何在 WPF 里面使用 luna 等复古主题 阅读全文
posted @ 2022-09-29 08:13 lindexi 阅读(364) 评论(0) 推荐(0)
摘要:我在开发软件进行测试时,需要测试拖入的文件被占用时软件的行为,于是就做了一个文件占用工具,此工具可以将某个文件进行占用,以及获取某个文件被哪个进程占用 阅读全文
posted @ 2022-09-29 08:13 lindexi 阅读(167) 评论(0) 推荐(0)
摘要:本文告诉大家几个不同的方法在 WPF 里,使用多线程修改或创建 ObservableCollection 列表的数据 阅读全文
posted @ 2022-09-29 08:12 lindexi 阅读(1993) 评论(2) 推荐(2)
摘要:本文记录将 WPF 控件放入到 UserControl 里,如果此 UserControl 没有被设置 Visibility 为可见过,那么放在此 UserControl 内的控件将获取不到 HwndSource 内容 阅读全文
posted @ 2022-09-29 08:12 lindexi 阅读(353) 评论(0) 推荐(0)
摘要:在 WPF 中,使用 Popup 也许会看到 PreviewMouseDown 事件被吃掉 阅读全文
posted @ 2022-09-29 08:12 lindexi 阅读(263) 评论(2) 推荐(0)
摘要:本文记录在 Popup 失焦后导致 ListBox 无法用 MouseWheel 滚动问题 阅读全文
posted @ 2022-09-29 08:11 lindexi 阅读(160) 评论(0) 推荐(0)
摘要:准确来说,这个不算是 WPF 的问题,而是系统等的问题。在某些设备上的使用了 WindowChrome 功能的 WPF 应用,将在运行过程,在 WindowChromeWorker 类里面抛出 System.OverflowException 异常。核心原因是这些设备是 x64 设备,运行的 x64 的 WPF 应用程序,在消息循环里面传入的 lParam 是一个 x64 的指针,但在 WPF 里面使用 ToInt32 方法进行转换,刚好此 x64 的指针超过 int 的范围,从而抛出异常 阅读全文
posted @ 2022-09-29 08:11 lindexi 阅读(548) 评论(5) 推荐(1)
摘要:大家都知道,在 WPF 里面,可以让资源字典合并其他资源字典,从而定义出资源字典引用树。然而在资源字典引用树里面,如果没有理清关系,将可以作出一个超级复杂的引用关系网。如果在性能优化中,将网断开部分,可能就会出现找不到资源的情况。本文将告诉大家 WPF 的资源字典树在引用和寻找关系上的坑 阅读全文
posted @ 2022-09-29 08:11 lindexi 阅读(2241) 评论(0) 推荐(3)
摘要:在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 UI 线程互等。这是多线程安全问题,不是很好复现,即使采用 demo 的代码,也需要几千次运行才能在某些配置比较差的机器上遇到新的 UI 线程和主 UI 线程互等,应用启动失败。本文来告诉大家复现的步骤,以及原因,和解决方法 阅读全文
posted @ 2022-09-29 08:11 lindexi 阅读(576) 评论(0) 推荐(0)
摘要:WPF 开源二维绘画小工具 GeometryToolDemo 项目这是一个演示 WPF 进行二维绘画的小工具 Demo 项目,基于 MIT 协议在 GitHub 上完全开源 阅读全文
posted @ 2022-09-29 08:10 lindexi 阅读(192) 评论(0) 推荐(0)
摘要:给 WPF 的 Pen 的 DashStyle 属性设置 0 0 的虚线,在绘制几何图形时,绘制的几何图形的尺寸将关联渲染线程所使用的 CPU 资源。大约在周长大于 500 时,将可以从任务管理器上看到高 CPU 占用 阅读全文
posted @ 2022-09-29 08:10 lindexi 阅读(154) 评论(0) 推荐(0)
摘要:对于 Cookie 的处理上,我最近遇到一个问题,那就是如何分割 Cookie 的内容。有人说是使用逗号分割,有人说是使用分号分割,究竟用哪个才是对的?其实这个答案是需要分为两个过程,分别是请求和响应,来进行回答。请求过程的 Cookie 和响应返回的 Cookie 的格式是不相同的 请求 Requ 阅读全文
posted @ 2022-09-29 08:10 lindexi 阅读(1473) 评论(0) 推荐(0)
摘要:本文记录某些软件,例如 向日葵远程控制 软件占用剪贴板,导致 WPF 应用使用剪贴板拷贝内容和设置剪贴板时,抛出 System.Runtime.InteropServices.COMException (0x800401D0): OpenClipboard 失败 (0x800401D0 (CLIPBRD_E_CANT_OPEN)) 异常 阅读全文
posted @ 2022-09-29 08:09 lindexi 阅读(1337) 评论(0) 推荐(0)
摘要:DirectX 使用 Vortice 从零开始控制台创建 Direct2D1 窗口修改颜色本文将告诉大家如何使用 Vortice 底层库从零开始,从一个控制台项目,开始搭建一个最简单的使用 Direct2D1 的 DirectX 应用。本文属于入门级博客,期望本文能让大家了解 Vortice 底层库是可以如何调用 DirectX 的功能,以及了解 DirectX 中,特别是 D2D 部分的初始化逻辑 阅读全文
posted @ 2022-09-29 08:09 lindexi 阅读(1315) 评论(0) 推荐(2)
摘要:本文告诉大家在使用 ObservableCollection 时,抛出 InvalidOperationException 异常,提示 Cannot change ObservableCollection during a CollectionChanged event 内容,的原因和解决方法 阅读全文
posted @ 2022-09-29 08:08 lindexi 阅读(290) 评论(0) 推荐(0)
摘要:WPF 推荐一个剪贴板内容查看工具本文来安利大家一个好用的 Windows 剪贴板的内容查看工具 阅读全文
posted @ 2022-09-29 08:07 lindexi 阅读(167) 评论(0) 推荐(0)
摘要:本文告诉大家如何解决界面打不开,抛出 System.ArithmeticException: Overflow or underflow in the arithmetic operation 异常的修复方法 阅读全文
posted @ 2022-09-29 08:07 lindexi 阅读(264) 评论(0) 推荐(0)
摘要:本文告诉大家如何调试 WPF 的某个依赖属性被变更的方法 阅读全文
posted @ 2022-09-29 08:07 lindexi 阅读(186) 评论(0) 推荐(0)
摘要:本文告诉大家如何在 WPF 里,通过 GifBitmapDecoder 调用 WIC 层来解析 GIF 图片,然后采用动画的方式进行播放 阅读全文
posted @ 2022-09-29 08:07 lindexi 阅读(218) 评论(0) 推荐(0)
摘要:随着 2022 9 月份 Uno 发布了 4.5 版本,现有的 WPF 应用多了一个新的开发模式,那就是通过 Uno Islands 技术,在现有的 WPF 应用里面嵌入 Uno 应用。通过此方式可以辅助在现有的 WPF 项目里面,部分功能迁入 Uno 项目,或者是某些新开发功能通过 Uno 实现,从而利用 Uno 跨平台的能力,逐个功能点支持跨平台功能。逐个小功能接入的方式,让开发者不需要为一次性迁移一个庞大的项目而烦恼 阅读全文
posted @ 2022-09-29 08:05 lindexi 阅读(407) 评论(2) 推荐(1)
摘要:本文告诉大家如何修复 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹的问题。如果 VisualStudio 构建时没有将 NuGet 的 PDB 符号文件拷贝到输出文件夹,那将会在调试的时候,由于找不到 PDB 符号文件而加载符号失败 阅读全文
posted @ 2022-09-29 08:05 lindexi 阅读(89) 评论(0) 推荐(0)
摘要:官方的 dnSpy 在 2021 时,由于某些吃瓜的原因 wtfsck 将 dnSpy 给 Archived 掉,在大佬被哄好之前,预计是不再更新。最新官方版本对 dotnet 6 的支持较弱,对于很多 dotnet 6 应用都无法成功调试,附加调试上去将会让应用卡住。好在 dnSpy 是开源的,也 阅读全文
posted @ 2022-09-29 08:05 lindexi 阅读(630) 评论(2) 推荐(1)
摘要:本文也叫 跟着 Stephen Toub 大佬学性能优化系列。大家都知道在 .NET 7 有众多的性能优化,其中就包括了对布尔和字符串互转的性能优化。在对布尔和字符串的转换的性能优化上,有着非常巧妙的思路,值得写篇博客记录 阅读全文
posted @ 2022-09-29 08:04 lindexi 阅读(481) 评论(0) 推荐(5)
摘要:本文记录 WPF 应用程序,因为系统的颜色配置 Mscms.dll 组件损坏导致应用加载图片失败,从而启动失败的原因和解决方法 阅读全文
posted @ 2022-09-27 08:57 lindexi 阅读(160) 评论(0) 推荐(0)
摘要:世界上有很多 OCR 识别技术,本文来和大家介绍如果在 WPF 里,在运行到 win10 的设备上,通过 Windows Runtime 自带的 Windows.Media.Ocr 实现在给定的图片里面识别文本的功能 阅读全文
posted @ 2022-09-21 08:48 lindexi 阅读(1056) 评论(0) 推荐(0)
摘要:本文告诉大家几个方法用来从 RGB 字符串转纯色的 SolidColorBrush 画刷 阅读全文
posted @ 2022-09-21 08:47 lindexi 阅读(638) 评论(0) 推荐(2)
摘要:在 VisualStudio 2022 里的某个版本开始,将会在移动文件到其他文件夹时,自动修改命名空间,使用匹配文件夹路径的命名空间。如果这个功能能顺手将其他引用此类型的全部符号同时变更,那自然是很好的功能,可惜没有,很多时候都只是修改了移动的文件里面的命名空间,没有更改其他相关引用的代码的逻辑,导致了移动一次文件需要重新将命名空间改回来修复构建,极大降低效率 阅读全文
posted @ 2022-09-21 08:43 lindexi 阅读(605) 评论(0) 推荐(0)
摘要:在安装完成了 100000000 个软件之后,我 1T 的 C 盘的空间终于不足了,由于安装了大量的特别挑的不专业的软件,强行放在其他的盘将水土不服。于是在老师傅的指导下,我采用了 mklink 神奇命令行,通过 mklink 可以实现将实际的文件放在其他的盘,然后建立链接到原先的地方,在应用上层基本感知不到文件的实际存储地方已经被更换。也就是物理上的文件存放是可以在另一个磁盘上,但软件以为文件还在原来的地方 阅读全文
posted @ 2022-09-21 08:42 lindexi 阅读(498) 评论(0) 推荐(1)
摘要:从设计上,用户控件 UserControl 就不是一个合适用来多次继承的类型,更不要说进行跨程序集继承自定义的 UserControl 用户控件。对于大部分的用户控件来说,都是采用组合现有的控件来实现的功能,本身应该被当成一个模块来进行使用。在 WPF 框架里面,从框架层阻止了开发者对自定义的 UserControl 用户控件跨程序集继承的逻辑,一旦尝试进行跨程序集继承,将在运行时抛出异常。本文将从源代码的角度告诉大家 WPF 框架是如何阻止跨程序集继承 阅读全文
posted @ 2022-09-21 08:42 lindexi 阅读(636) 评论(3) 推荐(4)
摘要:在 Windows 下,可以使用 DX 提供的强大能力,调用 DX 读取 TTF 字体文件,获取字体文件的信息以及额外的渲染信息。特别是基于 DX 的 WPF 更是加了一层封装,使用 FontFamily 类型提供的友好方法获取到字体的信息。出于学习的目的,本文将不使用任何平台封装好的方法,自己读取二进制的 TTF 文件,解析 TTF 的内容,获取到字体文件里面的字体名 阅读全文
posted @ 2022-09-21 08:41 lindexi 阅读(1689) 评论(0) 推荐(0)
摘要:在 dotnet 里面,使用 await 进行异步逻辑,默认是会尝试切换回调用 await 的线程同步上下文。这个机制对于大多数的上层应用来说都是符合逻辑且方便的逻辑,例如对于带 UI 线程的 WPF 或 WinForms 等应用,基础开发的执行逻辑基本都是在 UI 线程上,此时进入一次 await 再出来,期望如果是进入 await 之前是在 UI 线程,那么执行 await 完成之后,退出的代码也能在 UI 线程执行,正好这就是 dotnet 的默认行为。但是对于库开发者来说,情况就反过来的,库的开发者大部分时候更期望默认不要切换回调用方的线程,采用 Fody 的 ConfigureAwait.Fody 库,可以控制此默认的行为。本文将告诉大家如何使用 ConfigureAwait.Fody 库 阅读全文
posted @ 2022-09-21 08:40 lindexi 阅读(475) 评论(3) 推荐(1)
摘要:对于大型的应用软件,特别是客户端应用软件,应用启动过程中,需要执行大量的逻辑,包括各个模块的初始化和注册等等逻辑。大型应用软件的启动过程都是非常复杂的,而客户端应用软件是对应用的启动性能有所要求的,不同于服务端的应用软件。设想,用户双击了桌面图标,然而等待几分钟,应用才启动完毕,那用户下一步会不会就是点击卸载了。为了权衡大型应用软件在启动过程,既需要执行复杂的启动逻辑,又需要关注启动性能,为此过程造一个框架是一个完全合理的事情。我所在的团队为启动过程造的库,就是本文将要和大家介绍我所在团队开源的 dotnetCampus.ApplicationStartupManager 启动流程框架的库 阅读全文
posted @ 2022-09-21 08:37 lindexi 阅读(1138) 评论(3) 推荐(14)
摘要:在某些业务逻辑下,需要同时等待多个任务执行完成,才能继续往下执行后续逻辑。等待任务执行的逻辑,大部分情况下需要使用到 Task.WhenAll 方法,代码行数不少。另外,在需要获取多个异步任务的返回值的逻辑上,整体的逻辑代码量看起来也不少。本文将和大家介绍 TaskTupleAwaiter 库,通过 TaskTupleAwaiter 库可以方便等待多个任务执行完成,且方便获取各个异步任务的返回值 阅读全文
posted @ 2022-09-20 19:59 lindexi 阅读(138) 评论(0) 推荐(0)
摘要:本文告诉大家如何使用 Newtonsoft.Json 输出枚举首字符小写 阅读全文
posted @ 2022-09-20 19:58 lindexi 阅读(217) 评论(0) 推荐(0)
摘要:随着源代码生成的越来越多的应用,自然也遇到了越来越多开发上的坑,例如源代码的缩进是一个绕不过去的问题。如果源代码生成是人类可见的代码,我期望生成的代码最好是比较符合人类编写代码的规范。为了能让人类在阅读机器生成的代码的时候,不会想着拿刀砍那个编写代码生成代码的开发者,最好,或者说至少代码也应该有个缩进和换行吧。本文将安利大家通过 IndentedTextWriter 这个辅助类,用来辅助生成带缩进的内容 阅读全文
posted @ 2022-09-20 19:57 lindexi 阅读(82) 评论(0) 推荐(0)
摘要:本文告诉大家如何使用 OpenXML 解析 PPT 的图表,以面积图为入门例子告诉大家 OpenXML 的存储 阅读全文
posted @ 2022-09-20 19:57 lindexi 阅读(305) 评论(0) 推荐(0)
摘要:在 OpenXML 里的图表存放的日期时间很多存放的是数值,需要进行转换才能获取到用户可见的字符串 阅读全文
posted @ 2022-09-20 19:56 lindexi 阅读(180) 评论(0) 推荐(0)
摘要:我的应用是独立发布的,在用户的设备上不需要额外去安装 .NET 运行时。但是我的应用有一个需求是下载另一个应用作为插件,由本应用调起插件进程。本文告诉大家如何解决调用插件的进程时,赋值给插件进程运行时的文件夹路径,解决环境依赖 阅读全文
posted @ 2022-09-20 19:54 lindexi 阅读(137) 评论(0) 推荐(0)
摘要:本文告诉大家如何在 dotnet 6 下使用 HttpClient 更加精细的控制网络请求的超时,实现 HttpWebRequest 的 ReadWriteTimeout 功能 阅读全文
posted @ 2022-09-20 19:54 lindexi 阅读(873) 评论(0) 推荐(2)
摘要:本文将来和大家推荐一个基于最友好 MIT 协议的完全在 GitHub 上开源的,可代替 .NET Remoting 的 IPC 本机多进程通讯库 阅读全文
posted @ 2022-09-20 19:53 lindexi 阅读(1345) 评论(2) 推荐(2)
摘要:我尝试在 dotnet 6 使用 File.Exists 判断管道是否存在,如果管道存在再进行连接。然而这个逻辑将会接下来的 NamedPipeClientStream 调用 Connect 连接失败 阅读全文
posted @ 2022-09-20 19:52 lindexi 阅读(148) 评论(0) 推荐(0)
摘要:本文来和大家聊聊在 dotnet 5 和 dotnet 6 或更高版本的 dotnet 构建完成,在 bin 文件夹下,输出的 ref 文件夹。在此文件夹里面,将会包含项目程序集同名的 dll 文件,但是此 dll 文件的大小却很小,那这个文件夹是用来做什么的 阅读全文
posted @ 2022-09-20 19:51 lindexi 阅读(233) 评论(0) 推荐(0)
摘要:本文记录在 dotnet 6 的网络和在 .NET Framework 的行为的变更。在 dotnet 6 下,默认的网络请求在系统网络代理变更的时候,是不会动态切换代理的。例如在应用运行进行网络通讯之后,打开 Fiddler 抓包,此时将会发现 Fiddler 抓不到包,只有在应用重启之后才能抓到。或者是开着 Fiddler 抓包,然后退出 Fiddler 之后应用就断网了 阅读全文
posted @ 2022-09-19 08:55 lindexi 阅读(220) 评论(1) 推荐(1)
摘要:本文是读伟民哥翻译的 .NET内存管理宝典 这本书的笔记,我认为读书的过程也需要实践,这样对一知半解的知识也有较为清晰的了解。在阅读到 string 在内存的布局时,我看到 RuntimeHelpers 的 OffsetToStringData 数据,据说此属性可以获取到字符串的字符在内存存放的实际地址,本文将来写一个混合 C# 和 C++\CLI 的应用来进行测试 阅读全文
posted @ 2022-09-15 20:02 lindexi 阅读(96) 评论(0) 推荐(0)
摘要:在 Windows 下,颜色的格式有很多,我好奇为什么要设计出 R5G6B5 这样的格式?通过阅读一些书和官方的文档,似乎了解了为什么,我在本文记录一下 阅读全文
posted @ 2022-09-15 20:01 lindexi 阅读(167) 评论(0) 推荐(0)
摘要:本文记录一个因为 NVIDIA 显卡驱动错误而让 WPF 应用启动闪退问题 阅读全文
posted @ 2022-09-15 19:59 lindexi 阅读(457) 评论(0) 推荐(0)
摘要:本文记录某个应用在某台 Windows 8.1 x86 系统上,运行时抛出 OutOfMemoryException 异常,启动失败。应用程序能启动,但是在第一次碰到渲染时,就发现渲染初始化失败,从而让应用程序闪退 阅读全文
posted @ 2022-09-15 19:58 lindexi 阅读(580) 评论(0) 推荐(0)
摘要:本文收集 System.Net.Sockets.SocketException 异常错误码为 10106 导致无法联网的问题 阅读全文
posted @ 2022-09-15 19:58 lindexi 阅读(2274) 评论(0) 推荐(0)
摘要:我使用 User32 的 SetWindowPos 方法去设置一个跨进程的窗口,这个窗口是停止响应的,将让调用的 SetWindowPos 方法卡住,不继续执行逻辑。通过堆栈分析是卡在 NtUserSetWindowPos 方法上,调用 SetWindowPos 方法不返回 阅读全文
posted @ 2022-09-15 19:57 lindexi 阅读(329) 评论(0) 推荐(0)
摘要:在加上热重载时,源代码生成 Source Generator 的默认行为会让 Visual Studio 有些为难,其原因是热重载会变更代码,变更代码触发代码生成器更新代码,代码生成器更新的代码说不定又会有某些逗比逻辑再次触发热重载。于是就会发现在某些复杂的项目下,开启热重载之后,在编辑并继续界面将会等非常久,甚至再也无法继续。为了解决这个问题,大聪明设计了 Incremental Generators 机制,此 Incremental Generators 机制和 Source Generator 不冲突,被设计用来解决热重载的源代码生成性能问题,本文将告诉大家此新的 API 的入门级使用 阅读全文
posted @ 2022-09-15 19:55 lindexi 阅读(2254) 评论(0) 推荐(1)
摘要:这是一个 WPF 框架的 API 变更提议,记录一下博客 阅读全文
posted @ 2022-09-15 19:53 lindexi 阅读(78) 评论(0) 推荐(0)
摘要:无论是使用 WPF 全屏窗口,还是高性能全屏透明窗口,都会在 Chrome 97 以及使用 chromium 对应版本内核的应用的视频停止播放。这是 chromium 的一个优化,因为 chromium 认为,如果有全屏窗口盖在上面,自然此时停止播放视频可以节省资源。然而 chromium 却没有考虑到,有很多会议的应用,虽然是全屏的,但也是透明的,于是此时停止播放视频将是非预期的 阅读全文
posted @ 2022-09-15 19:52 lindexi 阅读(334) 评论(0) 推荐(0)
摘要:本文告诉大家如何在 WPF 里面,使用 Skia 解析绘制 SVG 图片。本文也适合控制台使用 SkiaSharp 解析绘制 SVG 图片,本文的 WPF 部分只是在 Skia 绘制完成之后,将 Skia 的内容绘制到 WPF 的 WriteableBitmap 图片,从而在界面显示 阅读全文
posted @ 2022-09-15 19:51 lindexi 阅读(1171) 评论(0) 推荐(0)
摘要:本文记录一个 WPF 在 dotnet 6 的一个已知问题,且此问题我已修复提交给官方仓库。这是一个只有在 dotnet 6 框架下,非 dotnet 5 也非 .NET Core 3.1 也非 .NET Framework 的问题,要求开启 DPI 感觉等级为 PerMonitorV2 的特性,在带触摸屏上的应用,应用运行过程中,切换屏幕的 DPI 之后,触摸过程有概率触发在触摸线程访问 UI 的依赖属性,在触摸线程抛出异常炸掉应用 阅读全文
posted @ 2022-09-15 19:50 lindexi 阅读(273) 评论(0) 推荐(2)
摘要:在 VisualStudio 2022 里的某个版本开始,将会在移动文件到其他文件夹时,自动修改命名空间,使用匹配文件夹路径的命名空间。如果这个功能能顺手将其他引用此类型的全部符号同时变更,那自然是很好的功能,可惜没有,很多时候都只是修改了移动的文件里面的命名空间,没有更改其他相关引用的代码的逻辑,导致了移动一次文件需要重新将命名空间改回来修复构建,极大降低效率 阅读全文
posted @ 2022-09-15 19:49 lindexi 阅读(218) 评论(0) 推荐(0)
摘要:本文告诉大家如何在 UWP 从 文件 StorageFile 转 SoftwareBitmap 图片的方法 阅读全文
posted @ 2022-09-15 19:48 lindexi 阅读(119) 评论(0) 推荐(0)
摘要:在国内垃圾的网络环境下,我在虚拟机里面安装了 Ubuntu 系统,准备用来测试 MAUI 在 Linux 上的行为,然而使用 dotnet restore 构建时,提示 NU1301 失败。我通过配置环境变量的方式,让 nuget 还原使用上我物理机的网络代理,成功将 NuGet 包下载 阅读全文
posted @ 2022-09-15 19:47 lindexi 阅读(1166) 评论(0) 推荐(0)
摘要:谷歌的 Skia 的一个卖点就是提供了完美的 SVG 的支持,包括输入和输出。输入指的是给一张 SVG 图片,将这个 SVG 渲染出来。输出就是将输出画面保存为 SVG 格式的图片。自然 SkiaSharp 是 Skia 的封装,也就带上了此功能。本文将告诉大家如何在 SkiaSharp 里面设置画面输出为 SVG 图片,使用 SkiaSharp 制作和编辑 SVG 图片 阅读全文
posted @ 2022-09-15 19:46 lindexi 阅读(880) 评论(0) 推荐(1)
摘要:本文记录使用 Microsoft.Maui.Graphics.Skia 的 DrawString 进行绘制文本,不同的重载方法绘制的文本的坐标不同的问题 阅读全文
posted @ 2022-09-15 19:36 lindexi 阅读(705) 评论(0) 推荐(1)
摘要:本文记录 FileStream 的 FlushAsync 方法在 .NET Framework 与 .NET Core 行为的不同 阅读全文
posted @ 2022-09-15 19:35 lindexi 阅读(90) 评论(0) 推荐(0)
摘要:在 dotnet 的最佳实践里面,不推荐在静态构造函数里面包含复杂的逻辑,其中也就包含了本文聊的和多线程相关的锁的使用。最佳做法是尽量不要在静态构造函数里面碰到任何和锁以及多线程安全相关的逻辑。本文来告诉大家,在静态构造函数里面使用锁将带来的问题以及原因 阅读全文
posted @ 2022-09-15 19:34 lindexi 阅读(148) 评论(1) 推荐(3)
摘要:在 .NET Framework 时代里面,有一组有趣的概念,那就是 SDK 和 Runtime 这两个概念。开发模式十分有趣,在开发者设备上,可以指定 .NET Framework 的 SDK 版本,例如指定 .NET Framework 4.5 版本。开发完成之后,分发给到用户,用户的电脑上所安装的 .NET Framework 基本都是 Runtime 版本。应用程序要求运行的 Runtime 版本一定要大于等于 SDK 的指定版本号 这就有一个非常有趣的问题了,我开发环境使用的 SDK 是低版本,例如 .NET Framework 4.5 版本。但用户的电脑上所安装的 .NET Framework 的 Runtime 版本是高版本,例如是 .NET Framework 4.7 版本,中间距离过了几年的版本。那行为如何保证相同?事实上,咱没有碰到过这个问题,这是因为在 .NET Framework 层做了很多兼容处理逻辑,其中就包括本文要和大家聊的 WPF 框架的兼容行为 阅读全文
posted @ 2022-09-15 19:33 lindexi 阅读(613) 评论(0) 推荐(0)
摘要:我在写域名备份功能,想要修改请求的 IP 地址,同时又将原有的请求域名带上。实现方法是修改请求的地址,在 HttpRequestMessage 的 Header 上添加 HOST 记录,记录的值就是原有的域名。然而在开启 Fiddler 之后,将会发现实际发出的请求的 HOST 是实际请求的地址 阅读全文
posted @ 2022-09-15 19:32 lindexi 阅读(222) 评论(0) 推荐(0)
摘要:本文记录一个开发和代码审查过程中,需要关注的细节。在 dotnet 里,在 .NET 6 和以下版本,包括 .NET Framework 版本,使用 NamedPipeClientStream 进行连接管道服务,如果此时的管道服务没有存在,或者还没有启动,调用 ConnectAsync 或 Connect 方法,将会进入一个循环,不断进行空跑,等待超时或者是连接上。默认的 ConnectAsync 或 Connect 方法,传入的超时时间都是无穷,也就是将会无限重试,不断消耗 CPU 资源 阅读全文
posted @ 2022-09-15 19:31 lindexi 阅读(360) 评论(0) 推荐(0)
摘要:和 UWP 与 WPF 不同的是在 MAUI 里面,使用可绑定对象 BindableObject 替换了依赖对象的概念,我阅读了 MAUI 的源代码发现其实只是命名变更了,里面的机制和设计思想都是差不多的。在 MAUI 里面提供 BindableObject 用来支持可绑定属性机制和附加属性机制,本文将告诉大家在 MAUI 里面是如何在可绑定对象里面提供可绑定属性和附加属性的存储的机制 阅读全文
posted @ 2022-09-13 08:34 lindexi 阅读(226) 评论(0) 推荐(2)
摘要:我在做一个图表工具软件,这个软件使用 MAUI 开发。我的需求是图表的内容需要和 PPT 的图表对接,需要用到 OpenXML 解析 PPT 内容,读取到 PPT 图表元素的内容,接着使用 MAUI 渲染层绘制图表元素。图表工具软件需要在 Windows 平台和 Linux 平台上运行。在 Windows 下,我采用 WPF 应用,用来辟谣说 MAUI 不支持 WPF 应用。 在 Linux 选用 Ubuntu 系统,采用 GTKSharp 应用加上 Skia 渲染对接 MAUI 框架 阅读全文
posted @ 2022-09-09 08:57 lindexi 阅读(5305) 评论(17) 推荐(43)