WPF开发随笔收录-自定义图标XamlIcon

技术WPF开发随笔收录-自定义图标XamlIcon WPF开发随笔收录-自定义图标XamlIcon一、前言
1、在以前自学的过程中,软件需要使用到图标的时候,总是第一个想法是下载一个图片来充当图标使用,

包含Wp开发文章-自定义图标XamlIcon

一、前言

1.在之前的自学过程中,当软件需要使用图标时,首先想到的总是下载一张图片作为图标使用,但实际效果会比较模糊。后来在网上了解到字体图标库的用法。我可以在阿里巴巴云矢量图网站把想要的图标添加到项目中,然后打包下载得到ttf图标库,然后用图标作为字体引用。这种方法实现的图标是矢量图,放大缩小不会影响图标的清晰度。

2.但是如果要在使用过程中添加一些新图标,就要下载字体库文件进行替换,有点麻烦。我从我的同事那里学到了另一种方法,它是通过下载svg图标,然后将其更改为xaml的路径来实现的。无需进一步讨论,我将直接介绍实现方法。

二、正文

1.首先,创建一个新项目。项目目录如下所示。在“控件”下,有一个自定义图标控件;在Enums下,有一个用于存储图标名称的枚举变量;在参考资料下,图标用于存储xaml图标。

2.登录阿里巴巴矢量图标库,挑出想要的图标,然后下载对应的svg格式,如下图。

3.下载后选择以文字形式打开,然后找到里面的路径,如下图。复制此部分的路径值,然后在项目目录中的图标下创建一个新的home.xaml文件,将路径粘贴到其中,并修改它以获得我们想要的文件。

home.xaml的代码如下。因为控件XamlIcon继承了Label,所以图标的填充颜色绑定到了“前景”属性。还有一点,记得选择home.xaml文件,打开属性页,将生成操作改为resources。

viewbox xmlns=' http://schemas . Microsoft.com/winfx/2006/xaml/presentation ' xmlns : x=' http://schemas . Microsoft.com/winfx/2006/xaml '

网格宽度='1025 '高度='1024 '

路径数据=' M867.2672 561.792 c-81.216-66.496-162.048-133.376-243.072-200.128 c 586.9472 331.008 549.6992 300.352 512.3872 269.568 c-3.264 2.368-6.006192-286.976 c 877.7632 574.592 874.8832 568.128 867.2672 561.792 z ' Fill=' { Binding Path=forecast,relative source={ relative source AncestorType={ x 3360 type Label } } } '/

路径数据=' m 1009.7312 495.808 c-38.08-31.68-75.776-63.808-114.56-94.592-13.184-10.432-18.24-21.12-18.048-38.208 1.024-76.608 0.512-153.28 0.0

5.168-4.0288 511.04-4.6688 519.04 11.5232 538.24c9.28 11.008 18.432 22.08 27.712 33.088 13.888 16.448 23.04 17.28 39.552 3.456 108.864-90.816 217.728-181.76 326.656-272.576C440.7712 272.704 476.2272 243.2 512.0032 213.376c35.712 29.76 70.848 59.008 105.92 88.256 109.184 91.136 218.432 182.272 327.616 273.408 16.32 13.632 25.408 12.672 39.424-3.968 9.536-11.328 19.008-22.72 28.544-34.048C1028.4192 519.296 1027.6512 510.72 1009.7312 495.808z" Fill="{Binding Path = Foreground, RelativeSource = { RelativeSource AncestorType ={ x:Type Label } }}" /
/Grid
/Viewbox

4、接着在Icons枚举变量中加入新增的图标名称,图标资源的加载是通过枚举的名称来加载的,所以枚举变量的定义记得对应上对应的xaml文件名称。

namespace XamlIconDemo.Enums
{
    public enum Icons
    {
        None,
        home,
    }
}

5、接着编写XamlIcon.cs的代码,如下

public class XamlIcon : Label
    {
        Dictionarystring, Viewbox globalIcon = new Dictionarystring, Viewbox();
        public Icons Icon
        {
            get { return (Icons)GetValue(IconProperty); }
            set { SetValue(IconProperty, value); }
        }
        public static readonly DependencyProperty IconProperty =
            DependencyProperty.Register("Icon", typeof(Icons), typeof(XamlIcon),
                new FrameworkPropertyMetadata(Icons.None, FrameworkPropertyMetadataOptions.AffectsArrange, new PropertyChangedCallback(IconChangedCallback)));
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            ReferenControls();
        }
        public XamlIcon()
        {
            this.VerticalContentAlignment = VerticalAlignment.Center;
            this.HorizontalContentAlignment = HorizontalAlignment.Center;
            this.Padding = new Thickness(0);
            this.Margin = new Thickness(0);
        }
        private static void IconChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            (d as XamlIcon).ReferenControls();
        }
        public void ReferenControls()
        {
            if (Icon == Icons.None)
            {
                this.Content = null;
                return;
            }
            var iconStr = Icon.ToString();
            var key = $"/XamlIconDemo;component/Resources/Icons/{iconStr}.xaml";
            if (globalIcon.ContainsKey(key))
            {
                this.Content = globalIcon[key];
            }
            else
            {
                StreamResourceInfo info = Application.GetResourceStream(new Uri(key, UriKind.Relative));
                using (var stream = info.Stream)
                {
                    Viewbox page = (Viewbox)XamlReader.Load(info.Stream);
                    this.Content = page;
                    globalIcon.Add(key, page);
                }
            }
        }
    }

6、到这里自定义图标控件就基本完成了,接着测试是否可用,在主页添加自定义的控件

Window x:Class="XamlIconDemo.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:ctls="clr-namespace:XamlIconDemo.Controls"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:XamlIconDemo"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
    Grid
        StackPanel Orientation="Horizontal" HorizontalAlignment="Center"
            ctls:XamlIcon Icon="home" Height="50" Width="50" Foreground="Green" Margin="20"/
            ctls:XamlIcon Icon="home" Height="100" Width="100" Foreground="Red" Margin="20"/
            ctls:XamlIcon Icon="home" Height="200" Width="200" Foreground="Blue" Margin="20"/
        /StackPanel
    /Grid
/Window

7、运行结果如下,可以看到图标已经成功显示出来了,并可以随意修改大小和填充色

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/154979.html

(0)

相关推荐

  • JavaScript编程语言概述

    技术JavaScript编程语言概述 JavaScript编程语言概述产生背景JavaScript最初由Netscape的Brendan Eich设计,最初将其脚本语言命名为LiveScript,后来N

    礼包 2021年11月22日
  • 英语代词表格归类,英语中代词one和it用法

    技术英语代词表格归类,英语中代词one和it用法释义反身代词是一种表示反射或强调的代词英语代词表格归类。它的基本含义是:通过反身代词指代主语,使施动者把动作在形式上反射到施动者自己。因此,反身代词与它所指代的名词或代词形

    生活 2021年10月28日
  • Charles 移动设备抓包

    技术Charles 移动设备抓包 Charles 移动设备抓包Charles 移动设备抓包(转载)
    除了最常见的网页爬虫,还有一种是针对客户端软件的爬虫。前者使用范围广泛,对后者的数据采集需求越来越大。

    礼包 2021年12月7日
  • Hibernate中提示serverTimezone出现问题怎么办

    技术Hibernate中提示serverTimezone出现问题怎么办小编给大家分享一下Hibernate中提示serverTimezone出现问题怎么办,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望

    攻略 2021年12月8日
  • 怎么把照片缩小到10k,照片怎么改成10K左右大小

    技术怎么把照片缩小到10k,照片怎么改成10K左右大小把照片改成10K左右大小可以用美图秀秀修改怎么把照片缩小到10k,操作方法如下: 1、打开常用的浏览器,在浏览器搜索栏上输入“美图秀秀”,选着美图秀秀的官方链接。 2

    生活 2021年10月21日
  • ssh-keygen参数(公钥默认写入ssh目录下的什么文件)

    技术ssh-keygen的公钥格式是什么样的这篇文章给大家介绍ssh-keygen的公钥格式是什么样的,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。ssh-keygen 公钥格式公钥:公钥有2种格式

    攻略 2021年12月24日