迁移桌面程序到MS Store(11)——应用SVG图标

在传统桌面程序中,对图标的使用大多是直接嵌入JPG或者PNG的图片。在祖传的1366x768分辨率下,并没有什么问题。相对于手机硬件的突飞猛进,也侧面反映了PC行业的落寞和桌面程序开发的不思进取。用360卫士的群众并不能倒推PC行业的升级。反倒是水果公司双高的利润和口碑让人很是眼馋。加之某软跳出来教猪队友做硬件。现在倒是有些起色,1080p的屏幕已是标配,4k也算常见。那么传统桌面程序在升级过程中,就会遇到今天要讨论的,如何解决高分辨率下图标模糊的问题。

一种解决方案是按最高的分辨率提供图片。这种适合较大的图片,比如背景啥的。另一种就是今天要讨论的,针对当前流行的、扁平化图标的解决方案。

迁移桌面程序到MS Store(11)——应用SVG图标_第1张图片

 从本篇的标题可以看出,我们希望应用SVG矢量图来适应各种分辨率的情况。以WPF程序为例,首先要面对的问题是,WPF并不支持像嵌入JPG/PNG图标这样,直接使用SVG图标。大动干戈的引用第三方library通过自定义类型来支持SVG并不是本文的目的。这里我们要介绍如何通过字体文件,进而在WPF或UWP中使用SVG图标的方式。

虽然WPF不支持直接使用SVG文件,但是Windows是支持矢量字体的。而我们的目的就是要将图标以字体的形式在WPF程序中显示。具体使用的字体TrueType,则是由微软和苹果共同开发的字体类型标准,该字体文件的扩展名是.ttf。

https://en.wikipedia.org/wiki/TrueType

接下来我们依然是通过Sample工程来说明。首先给出GitHub的地址:

https://github.com/manupstairs/WpfAppForFontIcon

首先我们打开WpfAppWithPNGs工程,图标的使用代码如下:

        <Image Grid.Row="0" Grid.Column="0"  Width="32" Height="32" Source="Resources/Airplane_Off.png" >Image>
        <Image Grid.Row="0" Grid.Column="1"  Width="64" Height="64" Source="Resources/Airplane_On.png" >Image>
        <Image Grid.Row="0" Grid.Column="2"  Width="96" Height="96" Source="Resources/Bluetooth_Off.png"  >Image>
        <Image Grid.Row="0" Grid.Column="3"  Width="128" Height="128" Source="Resources/Bluetooth_On.png"  >Image>

 

迁移桌面程序到MS Store(11)——应用SVG图标_第2张图片

这里主要有两个问题,因为我们默认提供的是32x32的图标,因此除了第一列Width和Height设置为32的图标,其他的图标都存在模糊的问题。第二个问题是针对图标的每一种颜色,都需要对应提供不同的图标文件(图中的例子需要有灰色和蓝色两份文件)。相对的SVG图标仅仅需要一份文件。即可在程序中动态设定不同的颜色了。

这里先给出最终WPF项目中,对SVG图标的引用的代码,然后我们再进行详细解释。对应的工程名为WpfAppWithFontIcons。

        <TextBlock Grid.Row="0" Grid.Column="0" Text="{x:Static local:FontIcons.airplane_mode_circ}"   Foreground="Gray"  FontSize="32" >TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="1" Text="{x:Static local:FontIcons.airplane_mode_circ}"  Foreground="{StaticResource dellBlue}"  FontSize="64" >TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="2" Text="{x:Static local:FontIcons.bluetooth_inactive}"   Foreground="Orange"  FontSize="96" >TextBlock>
        <TextBlock Grid.Row="0" Grid.Column="3" Text="{x:Static local:FontIcons.bluetooth_inactive}"    Foreground="Brown"  FontSize="128" >TextBlock>

代码最大的不同应该是由标签更改为标签,这是因为我们是通过ttf字体文件,曲线救国的方式来使用SVG图标。

具体的步骤如下:

准备SVG图标文件,将这些文件打包成一整个ttf字体文件。打包的方式有很多种,通常我使用的是IcoMoon的免费解决方案。地址如下:

https://icomoon.io/app/#/select

通过这个网站选择SVG图标文件上传,打包生成一个zip文件。解压后文件夹结构如下图:

迁移桌面程序到MS Store(11)——应用SVG图标_第3张图片

ttf文件在fonts文件夹中,实际使用时,需要作为资源文件,添加到WPF工程中。点击图中的demo.html会打开一个本地网页,可用于查找ttf文件中包含的SVG图标,以及对应的unicode。实际我们是通过对unicode的引用来显示SVG图标的。

迁移桌面程序到MS Store(11)——应用SVG图标_第4张图片

完整的project结构如下图,Fonts文件夹是手动添加用来放置ttf文件。ttf文件名字都是根据项目需要来取,并不固定。

迁移桌面程序到MS Store(11)——应用SVG图标_第5张图片

ttf字体文件需要以的形式添加到项目的节点中。然后再通过