HandyControl HatchBrushGenerator 使用指南:在 WPF 中绘制 50+ 种 WinForms 风格阴影图案
UI组件桌面应用【免费下载链接】HandyControlContains some simple and commonly used WPF controls项目地址https://gitcode.com/gh_mirrors/ha/HandyControl点击查看免费下载本文档doc/source/handycontrol/tools/hatchBrushGenerator/index.md配套讲解 HandyControl 的阴影画笔生成器HatchBrushGenerator它如何以一行代码生成 50 多种位图阴影图案画刷并保持与 WinFormsSystem.Drawing.Drawing2D.HatchBrush一致的外观行为。读完本文你将掌握生成器的调用方式、HatchStyle枚举全貌、底层DrawingBrush实现原理以及在 XAML/MVVM 中的集成方案可直接用于图表背景、编辑器纹理、报表填充、图像水印等场景。一、HatchBrushGenerator 是什么在 WPF 中原生控件体系并没有直接对应 WinFormsHatchBrush的阴影画刷类型。HandyControl 在 HatchBrushGenerator.cs 中实现了这一能力HC 提供了 50 多种不同图案的阴影样式其行为与 WinForms 中的表现一致。它的核心职责非常单一——给定一个HatchStyle枚举、一个前景色和一个背景色返回一个可直接赋值给Fill、Background等属性的DrawingBrush。由于返回类型是 WPF 标准画刷类型它可以在不引入任何额外依赖的情况下无缝替换SolidColorBrush、LinearGradientBrush等常规画刷。二、基础用法三步拿到阴影画刷根据文档中的案例使用过程只需两步第一步创建阴影画笔生成器实例var brushGenerator new HatchBrushGenerator();第二步调用GetHatchBrush方法传入HatchStyle枚举、前景色、背景色即可返回一个DrawingBrush画刷var brush brushGenerator.GetHatchBrush(HatchStyle.Horizontal, 前景色, 背景色);其中三个参数的完整含义如下参数类型说明hatchStyleHandyControl.Data.HatchStyle阴影图案样式共 53 个枚举值详见第三节foreColorSystem.Windows.Media.Color前景色决定图案线条/点阵本身的颜色backColorSystem.Windows.Media.Color背景色决定图案底衬区域的颜色返回值为System.Windows.Media.Brush实际是DrawingBrush可直接用于 WPF 任意接受Brush的属性。例如// 将一个以深蓝线条、浅灰底衬的十字交叉图案填充到矩形上 var rect new Rectangle { Width 200, Height 120, Fill new HatchBrushGenerator().GetHatchBrush( HatchStyle.Cross, Color.FromRgb(0x1E, 0x3A, 0x5F), Color.FromRgb(0xE8, 0xEE, 0xF5)) };三、HatchStyle 枚举全览53 种阴影图案HatchStyle枚举定义于 HatchStyle.cs共 53 个成员与源码中HatchBrushes位图表53 组 8×8 位数据一一对应。按图案特征可归为以下几类基础直线类枚举值图案描述Horizontal/Vertical水平线 / 垂直线ForwardDiagonal/BackwardDiagonal前向左上到右下/ 后向右上到左下斜线Cross/DiagonalCross十字交叉 / 斜线交叉密度百分比类点阵填充密度Percent05、Percent10、Percent20、Percent25、Percent30、Percent40、Percent50、Percent60、Percent70、Percent75、Percent80、Percent90——数字即表示前景点阵覆盖的近似密度百分比可用于灰度纹理的视觉分级。方向与粗细变体类LightDownwardDiagonal、LightUpwardDiagonal、DarkDownwardDiagonal、DarkUpwardDiagonal、WideDownwardDiagonal、WideUpwardDiagonal、LightVertical、LightHorizontal、NarrowVertical、NarrowHorizontal、DarkVertical、DarkHorizontal、DashedDownwardDiagonal、DashedUpwardDiagonal、DashedHorizontal、DashedVertical——覆盖粗细、间距、虚线等线条形态变化。装饰纹理类SmallConfetti、LargeConfetti大小彩纸点、ZigZag锯齿形、Wave波浪形、DiagonalBrick、HorizontalBrick砖墙形、Weave编织形、Plaid格子呢、Divot草皮形、DottedGrid点状网格、DottedDiamond点状菱形、Shingle瓦片形、Trellis栅格、Sphere球形、SmallGrid、SmallCheckerBoard、LargeCheckerBoard棋盘格、OutlinedDiamond、SolidDiamond菱形轮廓/实心。得益于枚举的顺序定义你可以在代码中通过Enum.GetValues或EnumDataProvider枚举全部图案结合 UI 下拉框实时预览见第五节。四、实现原理从 8×8 位图到平铺 DrawingBrush理解生成器的底层实现有助于预判它在不同渲染场景下的行为。源码 HatchBrushGenerator.cs 的核心逻辑可分为三部分。1. 内置 8×8 位图图案表类内部维护了一个静态二维字节数组HatchBrushes每种样式对应 8 个字节每个字节代表一行共 8 行即一张 8×8 的像素位图字节中每一位为 1 的位置即前景点。例如new byte[] {0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00}, // Horizontal new byte[] {0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08}, // Vertical new byte[] {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}, // ForwardDiagonal new byte[] {0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81}, // DiagonalCrossHorizontal的第 4 行为0xff全 1其余行全 0因此渲染结果是一条贯穿的横线——这正是 WinForms 同名样式的视觉语义也是文档所称行为与 WinForms 一致的根源。2. 位图到几何图形的转换GetHatchBrush首先通过GetHatchData取出对应样式的 8 个字节然后双重循环遍历 8×8 网格用位运算(hatchData[y] (0x80 x)) 0判断每个像素点是否为前景点是则向GeometryGroup追加一个 1×1 的RectangleGeometryfor (var y 0; y 8; y) { for (var x 0; x 8; x) { if ((hatchData[y] (0x80 x)) 0) { foreGeometryGroup.Children.Add(new RectangleGeometry(new Rect(x, y, 1, 1))); } } }3. 组装平铺画刷并开启缓存画刷由两层GeometryDrawing组成底层是用backColor填充的 8×8 背景矩形上层是用foreColor填充的前景几何组。关键配置Viewport new Rect(0, 0, 8, 8), // 平铺单元尺寸 ViewportUnits BrushMappingMode.Absolute, // 以设备无关像素(DIP)为单元 Stretch Stretch.None, // 不拉伸单元 TileMode TileMode.Tile, // 沿两个方向平铺最后一行RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);为画刷开启渲染缓存图案会被缓存为位图以便重复绘制在长列表、大数据面板等高频重绘场景下可显著减少几何重建开销。注意ViewportUnits Absolute意味着平铺单元固定为 8 DIP与控件缩放无关图案密度不会随元素尺寸变化而改变——这是使用中需要留意的行为特征。另外GetHatchData对越界枚举做了防御若传入值超出Horizontal到SolidDiamond的范围会抛出ArgumentOutOfRangeException因此传入非法枚举值是不安全的。五、在 XAML / MVVM 中的集成方式虽然文档只展示了代码调用方式仓库的示例工程HatchBrushGeneratorDemo.xaml提供了一套完整的数据驱动集成范式适合在真实项目中复用。1. 用 EnumDataProvider 提供 HatchStyle 数据源示例工程在 App.xaml 中通过hc:EnumDataProvider将HatchStyle枚举暴露为静态资源hc:EnumDataProvider x:KeyHatchStyles Typehc:HatchStyle/EnumDataProvider源码见 EnumDataProvider.cs继承自ObjectDataProvider构造时自动将方法名设为GetValuesType赋值时通过反射调用Enum.GetValues枚举全部成员并可结合BrowsableAttribute/DescriptionAttribute过滤与本地化显示。2. 用 IValueConverter 把枚举转成画刷示例定义了 HatchBrushConverter.cs实现IValueConverter将HatchStyle值转换为DrawingBrushpublic object Convert(object value, Type targetType, object parameter, CultureInfo culture) { if (value is HatchStyle style) { return _brushGenerator.GetHatchBrush(style, ResourceHelper.GetResourceColor(ResourceToken.DarkPrimaryColor), Colors.Transparent); } return Brushes.Transparent; }这里前景色取自主题资源DarkPrimaryColor背景色使用Colors.Transparent从而让阴影图案叠加在控件的底层背景之上。ConvertBack抛出NotSupportedException表明这是单向转换。3. 绑定到 UIBorder Style{StaticResource BorderRegion} Margin32 Background{Binding SelectedValue, ElementNameComboBoxDemo, Converter{StaticResource HatchBrushConverter}} ComboBox SelectedIndex0 VerticalAlignmentCenter NameComboBoxDemo Width180 ItemsSource{Binding Source{StaticResource HatchStyles}}/ /Border当用户在ComboBox中选择不同的HatchStyle时转换器即生成对应图案画刷Border的背景实时更新形成一个开箱即用的 53 种图案预览器。这套枚举数据源 值转换器 绑定的组合可直接迁移到属性面板、主题设计器等需要动态切换图案的场景。六、使用建议与注意事项颜色的选取前景色决定图案可见度建议与背景色保持足够对比度如需让图案叠在已有 UI 之上可仿照示例将背景色设为Colors.Transparent。平铺尺寸固定由于ViewportUnits为Absolute且单元为 8×8图案密度不随元素大小缩放若需要放大/缩小纹理可自行在外部对画刷做变换如ScaleTransform或在理解该行为的前提下接受固定密度。复用生成器实例HatchBrushGenerator是无状态工具类可像示例中的HatchBrushConverter一样作为单例/成员字段长期复用避免每次调用都重复创建。缓存已开启生成器内部已设置CachingHint.Cache同一画刷用于大量元素时具有较好渲染性能无需再手动缓存。枚举合法性GetHatchData对越界值抛出ArgumentOutOfRangeException业务代码中应避免传入无效枚举。HatchBrushGenerator 将 WinForms 时代成熟的阴影纹理体系带入了 WPF 与 HandyControl 生态无论是构建数据可视化底纹、模拟纸张/工程图纸背景还是为自定义控件提供装饰填充它都是轻量而可靠的选择。进一步可阅读 tools 目录 下的其他工具文档结合Effect、MorphingAnimation等能力搭建更丰富的视觉效果。赞分享UI组件桌面应用【免费下载链接】HandyControlContains some simple and commonly used WPF controls项目地址https://gitcode.com/gh_mirrors/ha/HandyControl点击查看免费下载相关推荐Flet BlurStyle 完全指南掌握四种阴影模糊渲染风格Flet BlurStyle 完全指南掌握四种阴影模糊渲染风格 导读 flet.BlurStyle 是 Flet 框架中控制 阴影BoxShadow模糊渲前端跨平台桌面应用移动开发ExcalidrawZ 使用指南macOS 手绘风格绘图工具ExcalidrawZ 使用指南macOS 手绘风格绘图工具 ExcalidrawZ 是一款基于 SwiftUI 构建的 macOS 绘图应用它扩展了 Ex跨平台图像处理终极指南使用ImageSharp在WinForms/WPF/UWP中快速集成跨平台图像处理终极指南使用ImageSharp在WinForms/WPF/UWP中快速集成 ImageSharp 是一个功能强大的跨平台2D图形处理库专门为图像处理图形学上一篇Wand-Enhancer技术架构深度解析与本地化增强方案实践指南下一篇WeMod增强器终极指南3步解锁专业版完整功能 创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

foundation-sunshine 的 Windows 双端目录映射:基于配对身份的 WSS 双向文件 RPC 设计解析

foundation-sunshine 的 Windows 双端目录映射:基于配对身份的 WSS 双向文件 RPC 设计解析

音视频 【免费下载链接】foundation-sunshine Sunshine fork: an enhanced sunshine, a self-hosted game streaming host for Moonlight with HDR10/HDR Vivid, virtual displays, advanced audio, optimized encoders, and a modern control panel. 项目地址: htt…

2026/10/4 7:57:34 阅读更多 →
Guanf jubj《关雎》字母标调的汉语拼音拼写实验案例

Guanf jubj《关雎》字母标调的汉语拼音拼写实验案例

此文基于这项规则:汉语拼音字母标调规则 Guanf jubj Yssmngt Xianqnk Guanf guanf jubj jiubb, zai hed zhp zhouf. Yaox tiox shumx nui, junp zij hao qiulq. Cen cip xngcx caic, zov youg liu zhp. Yaox tiox shumx nui, wsx meig qiu zhp. Qiu zhp bu …

2026/10/5 8:55:13 阅读更多 →
MIPI调试核心:校准与加扰机制详解及RK平台实战

MIPI调试核心:校准与加扰机制详解及RK平台实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 11:22:06 阅读更多 →

最新新闻

插件系统设计实战:从plugin.json到TypeScript SDK与CLI

插件系统设计实战:从plugin.json到TypeScript SDK与CLI

1. 插件系统到底解决了什么问题第一次接触插件机制是在给一个内部工具做扩展功能的时候。当时的需求很朴素:主程序已经上线了,但业务方隔三差五就要加一个小功能,每次都得改主程序、重新打包、重新发版。改到第五次的时候我意识到&#xff0c…

2026/10/5 13:47:16 阅读更多 →
EPLAN P8部件库搭建实战:低压电气设计标准化全流程

EPLAN P8部件库搭建实战:低压电气设计标准化全流程

1. 为什么我花了三个月整理一套EPLAN P8部件库 1.1 电气图纸的“半条命”其实在部件库 做电气控制系统设计的人,只要在EPLAN P8里画过几张正经的原理图,就迟早会撞上一堵墙:图纸上到处是问号、感叹号,设备没有部件数据&#xff0…

2026/10/5 13:47:16 阅读更多 →
分岔理论在限制性三体问题中的应用:平动点稳定性与轨道设计

分岔理论在限制性三体问题中的应用:平动点稳定性与轨道设计

1. 项目概述1.1 为什么要把分岔理论和三体问题放在一起先说个我自己的经历。几年前我在做深空轨道设计时,接手了一个任务:评估航天器在日地系统L1点附近的稳定性,然后判断是否可以利用L1点的自然动力学特性来节省燃料。当时我翻遍了手头的经典…

2026/10/5 13:47:16 阅读更多 →
车规MCU信息安全基石:AURIX TC3xx HSM硬件安全模块架构与启动流程解析

车规MCU信息安全基石:AURIX TC3xx HSM硬件安全模块架构与启动流程解析

搞车规 MCU 信息安全的人,这两年应该都绕不开一个词——HSM。尤其是当你拿到英飞凌 AURIX TC3xx 这类芯片,打开用户手册,翻到系统架构图,你会发现在一群 TriCore 主核旁边,还藏着一个“独立小系统”,这就是…

2026/10/5 13:47:16 阅读更多 →
多模态不再是“拼乐高“了——聊聊从拼接式到原生统一的这次架构转身

多模态不再是“拼乐高“了——聊聊从拼接式到原生统一的这次架构转身

10 月 1 号那天,地平线的余凯和黄畅时隔十年又联手发了一篇论文,开源了一套叫 MultimodalFlow(MF-1)的统一语言视觉模型。消息出来那天圈子里讨论得挺热闹,但说实话,真正让我在意的不是这个模型本身&#x…

2026/10/5 13:47:16 阅读更多 →
常规波束形成CBF深入解析:导向矢量推导与波束图工程实践

常规波束形成CBF深入解析:导向矢量推导与波束图工程实践

1. 从“听声辩位”说起:CBF到底在做什么做阵列信号处理的人,几乎都绕不开“常规波束形成”这个词。英文叫Conventional Beamforming,缩写CBF,老外文献里也常叫Delay-and-Sum Beamforming,也就是“延时求和波束形成”。…

2026/10/5 13:46:15 阅读更多 →

日新闻

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

马斯克杀回智能体战场,Grok 4.5万亿参数撑腰,Cursor接手数字白领项目:用TaoToken统一Key跑通多模型Agent工作流

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:22 阅读更多 →
AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

AI编程工具插件机制详解:plugin.json配置与加载失败排查指南

1. 从“plugins”这个词说起:它到底在解决什么问题如果你最近在折腾 AI 编程工具,尤其是 Cursor、Codex CLI、Claude Code 这类带 CLI 的编辑器或命令行助手,那你大概率绕不开一个词——plugins。这个词本身不新鲜,从浏览器到 IDE…

2026/10/5 0:00:23 阅读更多 →
第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

第26课:OpenClaw|日志审计与问题诊断:把日志链路改到 TaoToken 的排查清单

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 0:00:23 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 5:06:42 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 1:10:22 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/5 3:06:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 11:40:45 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 9:43:54 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/4 20:14:29 阅读更多 →