在WPF中使用矢量图标

news2024/9/21 16:19:36

使用SVG/Path

WPF支持绘图,在WPF中定义了一些基本图形,如Line、Rectangle、Ellipse、Path等

其中Path支持使用路径来进行绘图,所以大部分的图标可以通过Path来进行绘制。

因为本文主要是介绍矢量图标,所以不对绘图进行详细介绍,只介绍一些核心概念

Path的路径标记语法

这里涉及了其它各种图形,所以需要对WPF中的图形有一定的了解,可以参考后面的链接。

下面我们绘制一个简单的图形

1、打开Expression Blend,创建一个WPF工程,使用钢笔绘制一个简单的图标

说明:这里仅作演示,是随便绘的,可以根据实际需求进行绘制,如果不了解Blend的使用,可以参考后面的链接。

2、在界面上绘制后,生成的XAML代码如下:

1   <Path Data="M369.20455,99.305455 C480.96663,70.225598 475.06774,124.37409 332.90865,172.44228 190.74956,220.51046 431.91422,217.02243 431.91422,217.02243 431.91422,217.02243 257.44246,128.38531 369.20455,99.305455 z" Fill="#FFF4F4F5" Height="127" Canvas.Left="288.424" Stroke="Black" Stretch="Fill" Canvas.Top="91.11" Width="159"/>
2   <Path Data="M512.38636,181.12364" Fill="#FFF4F4F5" Height="1" Canvas.Left="512.386" Stroke="Black" Stretch="Fill" Canvas.Top="181.124" Width="1"/>

3、将路径合并

 此时的Path如下:

1  <Path Data="M81.202054,8.6827316 C192.34125,-20.408055 186.47523,33.760794 45.10845,81.847042 -96.258336,129.93329 143.56222,126.44395 143.56222,126.44395 143.56222,126.44395 -29.937139,37.773518 81.202054,8.6827316 z M224.46202,90.513998" Fill="#FFF4F4F5" Height="127" Canvas.Left="288.424" Stroke="Black" Stretch="Fill" Canvas.Top="91.11" Width="225" HorizontalAlignment="Center" VerticalAlignment="Center"/>

4、将绘制的图形应用到按钮中 

在https://www.cnblogs.com/zhaotianff/p/9844457.html这篇文章中,我封装了一个按钮控件,这里我们直接拿来用

1 <Window.Resources>
2     <Canvas x:Key="Icon.Test" Width="196" Height="127">
3         <Path Data="M81.202054,8.6827316 C192.34125,-20.408055 186.47523,33.760794 45.10845,81.847042 -96.258336,129.93329 143.56222,126.44395 143.56222,126.44395 143.56222,126.44395 -29.937139,37.773518 81.202054,8.6827316 z M224.46202,90.513998" Fill="#FFF4F4F5" Stroke="Black" Stretch="Fill" HorizontalAlignment="Center" VerticalAlignment="Center"/>
4     </Canvas>
5 </Window.Resources>
6 <Grid>
7     <controls:ImageButton Width="108" Height="112" Content="{StaticResource Icon.Test}" Text="Hello"/>
8 </Grid>

运行效果如下:

调整一下按钮大小:

1     <Window.Resources>
2         <Canvas x:Key="Icon.Test" Width="196" Height="127">
3             <Path Data="M81.202054,8.6827316 C192.34125,-20.408055 186.47523,33.760794 45.10845,81.847042 -96.258336,129.93329 143.56222,126.44395 143.56222,126.44395 143.56222,126.44395 -29.937139,37.773518 81.202054,8.6827316 z M224.46202,90.513998" Fill="#FFF4F4F5" Stroke="Black" Stretch="Fill" HorizontalAlignment="Center" VerticalAlignment="Center"/>
4         </Canvas>
5     </Window.Resources>
6     <Grid>
7         <controls:ImageButton Width="308" Height="270" Content="{StaticResource Icon.Test}" Text="Hello"/>
8     </Grid>

运行效果:

可以看到图标并不会失真。

但是如果每一个图标我们都自己进行绘制的话,太麻烦,就可以使用SVG,目前网上很多图标网站都可以下载图标的SVG版本。

SVG:可缩放矢量图形(Scalable Vector Graphics,SVG)基于 XML 标记语言,用于描述二维的矢量图形。

SVG中采用的路径语法和WPF中是一致的,所以我们可以直接拿来用。

如何在WPF中使用SVG图标

这里我们以阿里巴巴矢量图标库为例。

1、打开iconfont-阿里巴巴矢量图标库,搜索自己想要的图标

我这里搜索一个star,然后下载svg版本

2、用记事本打开如下

3、我们手动转换一下(将属性小写改为大写、d改为data、p-id等非WPF属性直接删除),得到如下XAML

1 <Path Data="M908.1 353.1l-253.9-36.9L540.7 86.1c-3.1-6.3-8.2-11.4-14.5-14.5-15.8-7.8-35-1.3-42.9 14.5L369.8 316.2l-253.9 36.9c-7 1-13.4 4.3-18.3 9.3-12.3 12.7-12.1 32.9 0.6 45.3l183.7 179.1-43.4 252.9c-1.2 6.9-0.1 14.1 3.2 20.3 8.2 15.6 27.6 21.7 43.2 13.4L512 754l227.1 119.4c6.2 3.3 13.4 4.4 20.3 3.2 17.4-3 29.1-19.5 26.1-36.9l-43.4-252.9 183.7-179.1c5-4.9 8.3-11.3 9.3-18.3 2.7-17.5-9.5-33.7-27-36.3zM664.8 561.6l36.1 210.3L512 672.7 323.1 772l36.1-210.3-152.8-149L417.6 382 512 190.7 606.4 382l211.2 30.7-152.8 148.9z" Fill="LightPink"></Path>

可以看到这里的起点是M908.1 353.11,坐标数很大了,所以直接使用这个图标的话,肯定会显示在理想区域之外。

这里提供两个方法,

一、使用ViewBox进行缩放,可以看到在SVG中也是使用了viewBox进行缩放的。

将ViewBox的宽高定义成实际需求的宽高即可,但是要注意的是,要保持图标的原始比例。

1  <Viewbox Stretch="Uniform" StretchDirection="Both" Width="128" Height="128">
2      <Path Data="M908.1 353.1 ........ 152.8 148.9z" Fill="LightPink"></Path>
3  </Viewbox>

二、使用工具进行裁剪

以前微软是有个工具叫Microsoft Expression Blend,功能很强大,可以自己绘制,也可以将svg转路径,png转路径,但是现在找不到下载地址了。

这里以Inkscape为例了

可以到官网下载Inkscape安装包:Inkscape 1.3.2 - Windows | Inkscape

觉得下载太慢,可以到这里下载:https://download.csdn.net/download/zhaotianff/88927104  (0积分)

下载完成后,我们用Inkscape打开svg,先选中图形, 按住shift,然后拖动角标,将图标进行缩放

然后在编辑菜单中选择页面设置为选区大小

打开文件菜单,选择另存为,选择微软XAML

 按下图设置就可以了

导出结果如下,我们可以直接复制Canvas到WPF中使用

实际运行效果如下:

说明:这里仅提供一个思路,因为矢量图的设计我也不熟悉,Inkscape我也是第一次用。

实际想达到最佳效果,还需要自行尝试。

使用IconFont

什么是IconFont

IconFont是包含符号和字形而不是字母或数字的字体。 它们在网络设计人员中很受欢迎,因为可以用CSS与常规文本相同的方式设置样式。另外,它也是矢量的。

最初IconFont是在Web开发中广泛使用的,但是也可以放到WPF中进行使用。

这里用得多的就是Font Awesome,官网地址:Font Awesome

在WPF中使用Font Awesome的方法

1、我们打开下载地址,选择桌面免费版

下载完成后,解压 

2、新建一个WPF工程,增加一个Fonts文件夹

复制"\fontawesome-free-6.5.1-desktop\otfs\Font Awesome 6 Free-Solid-900.otf"到工程Fonts文件夹中,并将文件生成操作改为Resource

3、定义一个字体样式

1     <FontFamily x:Key="FontawesomeStyle">/Fonts/#Font Awesome 6 Free Solid</FontFamily>

4、然后到官网搜索自己想要的图标,如star,复制图标的Unicode

5、还是使用前面定义的ImageButton控件,使用Icon Font时,将文本设置为 &#fxxxx; 即可,xxxx为Unicode代码

1  <controls:ImageButton Grid.Column="1" Width="256" Height="270" Content="&#xf005;" FontFamily="{StaticResource FontawesomeStyle}" Text="Hello World"/>

 运行效果:

使用开源的矢量图标库

这里以MahApps.Metro.IconPacks为例 

项目地址:NuGet Gallery | MahApps.Metro.IconPacks 5.0.0

 这是一套免费的图标库,原理跟第一种方式是一样的,但是可以直接拿来用,很方便。

使用步骤

1、下载图标浏览器, 方便查找图标

Release IconPacks.Browser v1.0.0 · MahApps/IconPacks.Browser · GitHub

2、搜索自己想要的图标,如star,然后复制代码

3、创建一个WPF工程,添加命名空间前缀

1        xmlns:iconPacks="http://metro.mahapps.com/winfx/xaml/iconpacks"

4、增加一个按钮,还是以前面的ImageButton为例,按钮的内容设置为图标内容,如下:

1   <controls:ImageButton Grid.Row="1" Width="256" Height="270" Text="Hello World">
2       <controls:ImageButton.Content>
3           <iconPacks:PackIconUnicons Kind="Favorite" />
4       </controls:ImageButton.Content>
5   </controls:ImageButton>

 运行效果如下:

 示例代码

参考资料

路径标记语法

路径标记语法 - WPF .NET Framework | Microsoft Learn

WPF绘图概述

Graphics rendering overview - WPF .NET Framework | Microsoft Learn

Blend For Visual Studio概述

Blend for Visual Studio 功能导览 | Microsoft Learn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2123516.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

opencv之图像梯度

图像梯度 图像梯度计算的是图像变化的速度。对于图像的边缘部分&#xff0c;其灰度值变化较大&#xff0c;梯度值也较大&#xff1b;相反&#xff0c;对于图像中比较平滑的部分&#xff0c;其灰度值变化较小&#xff0c;相应的梯度值也较小。一般情况下&#xff0c;图像梯度计…

重命名工具 | Advanced Renamer v4.03 绿色版

Advanced Renamer 是一款专为 Windows 平台设计的强大文件批量重命名工具。它提供了多种重命名方法&#xff0c;包括指定新文件名、改变大小写、移动字符、移除字符串、重编文件名序号、替换字符、添加内容、使用列表或列表文件替换文件名、交换字符位置、去除头部或尾部多余空…

百度Apollo打通与ROS的通信,扩展自动驾驶系统生态

技术文档&#xff5c;打通与ROS的通信&#xff0c;扩展自动驾驶系统生态_Apollo开发者社区 (baidu.com)

-顺序表-

一、小概述 二、代码解析 下面利用顺序表实现增删改查的功能&#xff1a; //动态顺序表 #include <iostream> using namespace std; typedef int SLDataType;//适用于多种类型 typedef struct SeqList {SLDataType* a;//数组int size;//表示数组中存储了多少个元素int …

【车载开发系列】ParaSoft单元测试环境配置(一)

【车载开发系列】ParaSoft单元测试环境配置(一) ParaSoft单元测试环境配置 【车载开发系列】ParaSoft单元测试环境配置(一)一. 什么是bdf文件二. bdf文件构成三. 新规做成bdf文件四. 导入bdf文件创建测试工程五. 获取编译器信息六. 新增自定义编译器Step1:打开向导Step2:…

Xcode 16 RC (16A242) 发布下载,正式版下周公布

Xcode 16 RC (16A242) - Apple 平台 IDE IDE for iOS/iPadOS/macOS/watchOS/tvOS/visonOS 请访问原文链接&#xff1a;https://sysin.org/blog/apple-xcode-16/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sysin.org Xcode 16 的新功…

【拓扑系列】拓扑排序

【拓扑系列】拓扑排序 前言认识有向无环图认识AOV网&#xff1a;顶点活动图拓扑排序 1. 课程表1.1 题目来源1.2 题目描述1.3 题目解析 2. 课程表 II2.1 题目来源2.2 题目描述2.3 题目解析 3. LCR 114. 火星词典3.1 题目来源3.2 题目描述3.3 题目解析 前言 认识有向无环图 图中…

AI基础 L13 Constraint Satisfaction Problems I约束满足问题

Defining Constraint Satisfaction Problems A constraint satisfaction problem (CSP) consists of three components, X, D, and C: • X is a set of variables, {X1, . . . , Xn}. • D is a set of domains, {D1, . . . , Dn}, one for each variable • C is a set of co…

STM32+ESP8266 WiFi连接机智云平台APP远程控制教程

本文档将介绍如何用STM32ESP8266 WiFi模块从零开始连接上机智云&#xff0c;并通过APP进行远程控制。 机智云官网&#xff1a;机智云|智能物联网操作系统 (gizwits.com) 准备&#xff1a;STM32、ESP8266、手机、可上网的WiFi。 1.创建设备 1.1 注册登陆 请自行注册账号并登陆…

脱离八股文,真实开发中的延时处理需求实现思路(超时订单处理为例)

前言 咱们聊聊那些在开发过程中经常遇到的延时处理需求吧。比如说&#xff0c;网购时那些迟迟不付款的订单&#xff0c;或者是社交软件里那些需要稍后处理的消息&#xff0c;再或者是金融交易中那些需要等待确认的交易。这些都是咱们得搞定的活儿。 不过&#xff0c;很多时候&a…

JS面试真题 part3

JS面试真题 part3 11、bind、call、apply区别&#xff1f;如何实现一个bind12、JavaScript中执行上下文和执行栈是什么13、说说JavaScript中的事件模型14、解释下什么是事件代理&#xff1f;应用场景&#xff1f;15、说说你对闭包的理解&#xff1f;闭包使用场景 11、bind、cal…

make 程序规定的 makefile 文件的书写语法

&#xff08;1&#xff09; 常用的 gcc 选项&#xff1a; &#xff08;2&#xff09; make 的作用&#xff1a; &#xff08;3&#xff09; 搭建 make 的实验环境 &#xff0c; linux 的很简单&#xff0c; windows 的复杂一点&#xff1a; windows 上 make 环境的搭建&#…

python爬虫基础:了解html

编辑器vscode <!DOCTYPE html> <html><head><title>第一个网页</title></head><body><h1>字体</h1><h2>字体</h2><h3>字体</h3><p>Lorem, ipsum dolor sit amet consectetur adipisicing…

电商平台如何实现自动监控订单签收状态,加快资金划拨进程?

资金划拨作为交易流程的核心环节之一&#xff0c;直接关系到商家资金回笼的速度、消费者购物体验的满意度以及平台自身的信誉与稳定性。 区别于自营电商&#xff0c;电商平台入驻了许多第三方商家&#xff0c;为了保障交易安全和控制风险&#xff0c;在交易未完成之前&#xff…

Java 入门指南:Java 并发编程 —— 同步工具类 Semephore(信号量)

文章目录 同步工具类Semephore核心功能限制并发访问量公平与非公平策略灵活性与适应性 常用方法使用示例 同步工具类 JUC&#xff08;Java.util.concurrent&#xff09;是 Java 提供的用于并发编程的工具类库&#xff0c;其中包含了一些通信工具类&#xff0c;用于在多个线程之…

Spring和MyBatis常见面试题总结

文章目录 1 Spring 基础1.1 说一下你对 Spring 的理解&#x1f525;1.2 Spring,Spring MVC,Spring Boot 之间什么关系?1.3 Spring 框架中用到了哪些设计模式&#xff1f;&#x1f525;1.4 说说自己对于 Spring MVC 了解?1.5 Spring MVC 的核心组件有哪些&#xff1f;1.6 Spri…

flutter开发实战-GoRouter路由go与push区别实践

flutter开发实战-GoRouter路由go与push区别实践 GoRouter是一个flutter的声明性路由包&#xff0c;使用路由器API提供一个方便的、基于url的API&#xff0c;用于在不同屏幕之间导航。可以定义URL模式、使用URL导航、处理深度链接以及许多其他与导航相关的场景。 之前使用了Go…

Vue3封装table表格右键菜单功能

1) 效果&#xff0c;右键单击单元格&#xff0c;打开菜单弹窗: 点击菜单选项&#xff0c;可选择只读/编辑&#xff0c;可在只读/编辑方法中&#xff0c;拿到该行列表格的数据&#xff0c;进行相关操作 2) 思路 1、右键菜单组件 出现的时机&#xff0c;是右键单击table表格row-…

移动安全需求分析与安全保护工程

移动应用安全威胁与需求分析 移动应用系统组成&#xff1a; 移动应用&#xff1a;简称App 通信网络&#xff1a;无线网络&#xff0c;移动通信网络及互联网 应用服务端&#xff1a;由相关服务器构成&#xff0c;负责处理来自App相关信息或数据 移动应用安全分析 Android系统…

【0基础】制作HTML网页小游戏——贪吃蛇(附详细解析)

我在昨天的文章&#xff08;贪吃蛇HTML源码&#xff09;里面分享了网页版贪吃蛇小游戏的源码&#xff0c;今天就来给大家详细讲解一下每部分代码是如何运作的&#xff0c;以及以后要如何美化贪吃蛇的UI界面&#xff0c;在哪里修改等。 目录 一、代码运作 1、HTML结构: 2、C…