在WPF中,通过资源文件实现主题切换是个常见的功能,有不少文章介绍了如何实现手动切换主题。那如何实现自动切换主题呢?通常有两种机制:一是跟随系统明暗主题切换,二是像手机操作系统那样根据日出日落时间自动切换。本文将以终为始,采用倒推法一步步介绍如何使用.NET免费获取日出日落时间。 获取日出日落时间 日出日落时间会随季节及各地方经度纬度的不同而不同,此外还会受到大气折射等因素的影响。计算日出和日落时间通常需要考虑以下因素: 日期:具体的年、月、日,用于确定太阳相对于地球的位置。 经度:地理位置的经度,影响日出和日落的具体时刻。 纬度:地理位置的纬度,影响日出和日落时间的早晚以及全年日照时间的长...

  NPQODODLqddb   2天前   8   0   0 .NET

看到巧用CSS/SVG实现复杂线条光效动画的文章,便也想尝试用WPF的Shape配合动画实现同样的效果。ChokCoco大佬的文章中介绍了基于SVG的线条动画效果和通过角向渐变配合MASK实现渐变线条两种方式。WPF中的Shape与SVG非常相似,因此这种方式也很容易实现。但WPF中仅有的两种渐变画刷不包含角向渐变,本文使用了另外两种方式实现同样的效果。 在Avalonia的API文档中有看到ConicGradientBrush,应该可以用角向渐变的方式来实现。 首先看一下三种方式实现的效果(录制的gif中颜色存在一些偏差,动画有些卡顿,实际效果要好一些): 基于Polyline的线条动画...

  NPQODODLqddb   2天前   5   0   0 .NET

在某些场景下,需要把程序绑定到指定CPU核心提高执行效率。通过微软官方文档查询到Windows提供了两个Win32函数:SetThreadAffinityMask和SetProcessAffinityMask为指定线程和进程设置处理器关联掩码。通俗的讲就是在指定的CPU核心上执行线程或者进程。 这里的CPU核心指的是逻辑核心,而非物理核心。 SetThreadAffinityMask SetThreadAffinityMask用于设置指定线程的处理器关联掩码,从而实现线程对处理器的绑定。 SetThreadAffinityMask函数定义 SetThreadAffinityMask的定义如...

  NPQODODLqddb   20天前   29   0   0 .NET

有网友问WPF中一些文字模糊是什么问题。之前我也没有认真思考过这个问题,只是大概知道和WPF的像素对齐(pixelsnapping)、抗锯齿(anti-aliasing)有关,通过设置附加属性TextOptions.TextFormattingMode或者TextOptions.TextRenderingMode来解决。这次我也查了下资料,了解了这几个附加属性的取值范围以及用法。 像素对齐和抗锯齿 我们经常听到WPF具有分辨率无关性这个说法,因为WPF使用的是与设备无关的绘图系统,为字体和形状等内容指定大小或者尺寸的数值并不是真实的像素,在WPF中称之为设备无关单位。渲染过程中,WPF会自动把...

  NPQODODLqddb   2024年03月12日   40   0   0 .NET

在硬件性能不断提升的现在,软件性能依旧是开发人员关注的重点。不同类型的程序关注的具体性能指标有所不同,服务器程序注重吞吐量,游戏引擎追求渲染效率,桌面程序则关注内存消耗以及界面加载效率和流畅性。当我们需要进行性能优化时,首先需要找到性能瓶颈。本文将介绍两个WPF性能优化分析工具:内存使用率和应用程序时间线的使用。 内存使用率 内存使用率是VisualStudio中集成的诊断工具之一,适用于.Net程序查找内存泄漏或者低效内存适用情况。 默认情况下,调试程序时诊断工具窗口会自动开启停靠在右侧或者底部。如果因为个人适用习惯关闭了诊断工具窗口,可以通过顶部菜单栏找到“调试”—>“窗口”—&gt...

  NPQODODLqddb   2024年02月29日   77   0   0 .NET

在用户界面技术中,绘图是一个绕不开的话题。WPF提供了多种可根据应用程序要求进行优化的2D图形和图像的处理功能,包括画刷(Brush)、形状(Shape)、几何图形(Geometry)、图画(Drawing)和变换(Transform)等。其中形状(Shape)、几何图形(Geometry)和图画(Drawing)承担了基础的绘图功能,形状(Shape)使用方便简单,但占用资源相对较多,几何图形(Geometry)和图画(Drawing)则更轻量。 什么是形状、几何图形和图画 在WPF中,形状(Shape)是专门用于表示直线、椭圆、矩形以及多边形的绘图图元(primitive),可以绘制到窗口...

  NPQODODLqddb   2024年02月19日   87   0   0 .NET

WPF中我们引用资源时常常提到一个概念:packURI,这是WPF标识和引用资源最常见的方式,但不是唯一的方式。本文将介绍WPF中引用资源的几种方式,并回顾一下packURI标识引用在不同位置的资源文件的写法。 WPF中引用资源的几种方式 WPF中使用URI标识和加载位于各种位置的文件,包括当前程序集资源文件、其他程序集资源文件、本地磁盘文件、网络共享文件、web站点文件。 程序集资源文件 程序集资源文件是最常见的一种情况。这里程序集资源指的是资源文件属性的生成操作(BuildAction)为Resource的文件,而非嵌入的资源(EmmbeddedResource)。程序集中的资源文件通常使...

  NPQODODLqddb   2023年12月31日   28   0   0 .NET

XAML是基于XML的语言,其遵循并扩展了XML的语法规则。其中一项扩展就是标记扩展(MarkupExtension),比如我们经常使用的绑定Binding和x:Type。 什么是标记扩展 标记扩展允许在XAML标记中使用特殊的语法来动态地为特性(Attribute)赋值或执行其他操作。简单来说,在XAML中,所有为XAML元素特性(Attribute)赋值时,使用花括号{}包裹起来的语句就是标记扩展。这么定义不是特别严谨,因为转义序列也是以花括号{}作为标记的,但不是标记扩展。[1]后边提到的x:Array标记扩展使用的是<>。 标记扩展的语法是{标记扩展类参数},所有的标记扩展...

  NPQODODLqddb   2023年12月31日   22   0   0 .NET

消息对话框是UI界面中不可或缺的组成部分,用于给用户一些提示,警告或者询问的窗口。在WPF中,消息对话框是系统原生(user32.dll)的MessageBox,无法通过Style或者Template来修改消息对话框的外观。因此,当需要一个与应用程序主题风格一致的消息对话框时,只能自己动手造轮子了。 确定“轮子”的功能 消息对话框的核心功能是向用户显示信息,并在用户对消息进行处理前中断用户的操作。根据常见的应用场景,可以梳理出以下几点功能: 支持的消息类型:提示信息、警告信息、错误信息、询问信息 支持的对话框类型:迷你模式(显示简要信息并自动关闭)、普通模式、完整模式(适用于消息内容分层级显...

  NPQODODLqddb   2023年12月31日   14   0   0 .NET

.NET中至少有6种定时器,每一种定时器都有它的用途和特点。根据定时器的应用场景,可以分为UI相关的定时器和UI无关的定时器。本文将简单介绍这6种定时器的基本用法和特点。 UI定时器 .NET中的UI定时器主要是WinForm、WPF以及WebForm中的定时器。分别为: System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer System.Web.UI.Timer 通常情况下,WinForm、WPF中的定时器是在UI线程上执行回调函数,因此可以直接访问UI元素。由于WinForm、WPF支持单线程单元模型(S...

  NPQODODLqddb   2023年12月31日   18   0   0 .NET

.NET中有多少种定时器一文介绍过.NET中至少有6种定时器,但精度都不是特别高,一般在15ms55ms之间。在一些特殊场景,可能需要高精度的定时器,这就需要我们自己实现了。本文将讨论高精度定时器实现的思路。 高精度定时器 一个定时器至少需要考虑三部分功能:计时、等待、触发模式。计时是进行时间检查,调整等待的时间;等待则是用来跳过指定的时间间隔。触发模式是指定时器每次Tick的时间固定还是每次定时任务时间间隔固定。比如定时器时间间隔10ms,定时任务耗时7ms,是每隔10ms触发一次定时任务,还是等定时任务执行完后等10ms再触发下一个定时任务。 计时 Windows提供了可用于获取高精度时间...

  NPQODODLqddb   2023年12月31日   25   0   0 .NET

.NET中有多少种定时器一文介绍过.NET中至少有6种定时器,但精度都不是特别高,一般在15ms55ms之间。在一些特殊场景,可能需要高精度的定时器,这就需要我们自己实现了。本文将讨论高精度定时器实现的思路。 高精度定时器 一个定时器至少需要考虑三部分功能:计时、等待、触发模式。计时是进行时间检查,调整等待的时间;等待则是用来跳过指定的时间间隔。触发模式是指定时器每次Tick的时间固定还是每次定时任务时间间隔固定。比如定时器时间间隔10ms,定时任务耗时7ms,是每隔10ms触发一次定时任务,还是等定时任务执行完后等10ms再触发下一个定时任务。 计时 Windows提供了可用于获取高精度时间...

  NPQODODLqddb   2023年12月22日   28   0   0 .NET

前段时间看到群友讨论压缩包能不能运行,想起了n年前用自解压文件SFX实现的一个“需求”:在没有安装任何应用软件的Windows(当时还要支持XP)上能双击打开自定义格式的文件。当时第一反应是这“需求”太奇葩了,简直是不可能。但思考后认为这个“需求”存在一定的合理性,因为当时的目标用户群体并不能熟练使用电脑,可能不知道打开一个文件需要安装对应的软件。 这里“需求”之所以打上引号,是因为我觉得这不是真正的需求,而是一个解决方案,真正的需求是如何让不熟悉电脑操作的用户方便的使用我们自定义格式的文件。 实施方案 Windows系统的注册表中会记录文件格式与对应软件的关联关系,双击文件时会找到关联的...

  NPQODODLqddb   2023年12月07日   22   0   0 Windows

.NET中至少有6种定时器,每一种定时器都有它的用途和特点。根据定时器的应用场景,可以分为UI相关的定时器和UI无关的定时器。本文将简单介绍这6种定时器的基本用法和特点。 UI定时器 .NET中的UI定时器主要是WinForm、WPF以及WebForm中的定时器。分别为: System.Windows.Forms.Timer System.Windows.Threading.DispatcherTimer System.Web.UI.Timer 通常情况下,WinForm、WPF中的定时器是在UI线程上执行回调函数,因此可以直接访问UI元素。由于WinForm、WPF支持单线程单元模型(S...

  NPQODODLqddb   2023年12月01日   24   0   0 .NET

XAML是基于XML的语言,其遵循并扩展了XML的语法规则。其中一项扩展就是标记扩展(MarkupExtension),比如我们经常使用的绑定Binding和x:Type。 什么是标记扩展 标记扩展允许在XAML标记中使用特殊的语法来动态地为特性(Attribute)赋值或执行其他操作。简单来说,在XAML中,所有为XAML元素特性(Attribute)赋值时,使用花括号{}包裹起来的语句就是标记扩展。这么定义不是特别严谨,因为转义序列也是以花括号{}作为标记的,但不是标记扩展。[1]后边提到的x:Array标记扩展使用的是<>。 标记扩展的语法是{标记扩展类参数},所有的标记扩展...

  NPQODODLqddb   2023年11月17日   35   0   0 .NET

WPF中我们引用资源时常常提到一个概念:packURI,这是WPF标识和引用资源最常见的方式,但不是唯一的方式。本文将介绍WPF中引用资源的几种方式,并回顾一下packURI标识引用在不同位置的资源文件的写法。 WPF中引用资源的几种方式 WPF中使用URI标识和加载位于各种位置的文件,包括当前程序集资源文件、其他程序集资源文件、本地磁盘文件、网络共享文件、web站点文件。 程序集资源文件 程序集资源文件是最常见的一种情况。这里程序集资源指的是资源文件属性的生成操作(BuildAction)为Resource的文件,而非嵌入的资源(EmmbeddedResource)。程序集中的资源文件通常使...

  NPQODODLqddb   2023年11月12日   28   0   0 .NET

在WPF中,引入了依赖属性这个概念,提到依赖属性时通常都会说依赖属性能节省实例对内存的开销。此外依赖属性还有两大优势。 支持多属性值,依赖属性系统可以储存多个值,配合Expression、Style、Animation等可以给我们带来很强的开发体验。 加入了属性变化通知,限制、验证等功能。方便我们使用少量代码实现以前不太容易实现的功能。 本文将主要介绍依赖属性是如何存取数据的以及多属性值的取值优先级。 CLR属性 CLR属性是private字段安全访问的封装 对象实例的每个private字段都会占用一定的内存,字段被CLR属性封装起来,每个实例看上去都带有相同的属性,但并不是每个实例的CL...

  NPQODODLqddb   2023年11月06日   47   0   0 .NET

在WinForm/WPF中使用CefSharp混合开发时,通常需要自定义滚动条样式,以保证应用的整体风格统一。本文将给出一个简单的示例介绍如何自定义CefSharp中滚动条的样式。 基本思路 在前端开发中,通过CSS来控制滚动条的样式是件寻常的事情。CefSharp也提供了功能强大的API方便开发人员使用c与JS进行交互。这也给我们提供了一个思路:在CefSharp加载完成后,使用其提供的ExecuteJavaScriptAsync方法注入JS和CSS代码来自定义滚动条样式。 实现细节 为了排除干扰以及方便介绍,本文直接从GitHub上下载CefSharp.MinimalExample的示例代...

  NPQODODLqddb   2023年11月06日   24   0   0 .NET

Freezable是WPF中一个特殊的基类,用于创建可以冻结(Freeze)的可变对象。冻结一个对象意味着将其状态设置为只读,从而提高性能并允许在多线程环境中共享对象。 Freezable的应用 我们定义画刷资源的时候常常会这样写: <SolidColorBrushx:Key="RedBrush"Color="Red"o:Freeze="True"/> 代码中的o:Freeze="True"其实就是使用Freezable的Freeze方法冻结画刷,使之不可修改,系统不必监视该画刷对象,从而减少资源消耗。 o:Freeze="True"乍一看像附加属性,其实并不是的。Freeze...

  NPQODODLqddb   2023年11月06日   21   0   0 .NET

在UI交互中,拖拽操作是一种非常简单友好的交互。尤其是在ListBox,TabControl,ListView这类列表控件中更为常见。通常要实现拖拽排序功能的做法是自定义控件。本文将分享一种在原生控件上设置附加属性的方式实现拖拽排序功能。 该方法的使用非常简单,仅需增加一个附加属性就行。 <TabControl assist:SelectorDragDropAttach.IsItemsDragDropEnabled="True" AlternationCount="{BindingClassInfos.Count}" ContentTemplate="{StaticResourcecon...

  NPQODODLqddb   2023年11月06日   18   0   0 .NET
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~