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)

相关推荐

  • relocating对Elasticsearch集群的影响是什么

    技术relocating对Elasticsearch集群的影响是什么本篇内容主要讲解“relocating对Elasticsearch集群的影响是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面

    攻略 2021年10月25日
  • who后面的动词用什么形式,who做主语谓语动词用什么形式

    技术who后面的动词用什么形式,who做主语谓语动词用什么形式who作主语时,谓语可以是单数,也可以是复数。 who可以指单数,也可以指复数。所以,who 作主语时,谓语可以是单数,也可以是复数。如who does it

    生活 2021年10月25日
  • mysql小数可用的类型有哪些

    技术mysql小数可用的类型有哪些小编给大家分享一下mysql小数可用的类型有哪些,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

    攻略 2021年12月1日
  • PHP+Redis怎么实现点赞效果

    技术PHP+Redis怎么实现点赞效果这篇文章主要介绍“PHP+Redis怎么实现点赞效果”,在日常操作中,相信很多人在PHP+Redis怎么实现点赞效果问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望

    攻略 2021年11月30日
  • git_stats web代码图形统计工具怎么使用

    技术git_stats web代码图形统计工具怎么使用这篇文章主要讲解了“git_stats web代码图形统计工具怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“

    攻略 2021年12月10日
  • 交易所eos节点(如何在eos钱包充值到交易所)

    技术交易所通过eosjs进行充值与转账的代码片段是怎样的交易所通过eosjs进行充值与转账的代码片段是怎样的,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望

    攻略 2021年12月14日