基于WPF實(shí)現(xiàn)路徑圖標(biāo)控件
WPF 實(shí)現(xiàn)路徑圖標(biāo)控件
框架使用.NET4;
Visual Studio 2022;

實(shí)現(xiàn)方法
1)新增 PathIcon.cs 代碼如下:
定義PathIcon類,它繼承自Control類,新增兩個(gè)依賴屬性
Kind屬性是一個(gè)枚舉類型的依賴屬性,用于指定圖標(biāo)的種類。Data屬性是一個(gè)Geometry類型的依賴屬性,用于存儲(chǔ)圖標(biāo)的路徑數(shù)據(jù)。
OnKindChanged當(dāng)Kind屬性發(fā)生變化時(shí)會(huì)被調(diào)用。它首先獲取新值,并根據(jù)新值構(gòu)建資源名稱。然后,通過調(diào)用FindResource方法查找對應(yīng)的$"WD.{kind}Geometry"資源,并將其賦值給Data屬性。
using?System.Windows;
using?System.Windows.Controls;
using?System.Windows.Media;
namespace?WPFDevelopers.Controls
{
????public?class?PathIcon?:?Control
????{
????????public?static?readonly?DependencyProperty?KindProperty?=
????????????DependencyProperty.Register(nameof(Kind),?typeof(string),?typeof(PathIcon),
????????????????new?PropertyMetadata(string.Empty,?OnKindChanged));
????????public?static?readonly?DependencyProperty?DataProperty?=
????????????DependencyProperty.Register(nameof(Data),?typeof(Geometry),?typeof(PathIcon));
????????public?PackIconKind?Kind
????????{
????????????get?{?return?(PackIconKind)GetValue(KindProperty);?}
????????????set?{?SetValue(KindProperty,?value);?}
????????}
????????public?Geometry?Data
????????{
????????????get?{?return?(Geometry)GetValue(DataProperty);?}
????????????set?{?SetValue(DataProperty,?value);?}
????????}
????????private?static?void?OnKindChanged(DependencyObject?d,?DependencyPropertyChangedEventArgs?e)
????????{
????????????var?pathIcon?=?(PathIcon)d;
????????????var?kind?=?(string)e.NewValue;
????????????if?(!string.IsNullOrWhiteSpace(kind))
????????????{
????????????????kind?=?$"WD.{kind}Geometry";
????????????????pathIcon.Data?=?(Geometry)pathIcon.FindResource(kind);
????????????}
????????????else
????????????????pathIcon.Data?=?null;
????????}
????????static?PathIcon()
????????{
????????????DefaultStyleKeyProperty.OverrideMetadata(typeof(PathIcon),?new?FrameworkPropertyMetadata(typeof(PathIcon)));
????????}
????}
}2)新增 PathIcon.xaml 代碼如下:
使用Viewbox控件包裹Path控件,以實(shí)現(xiàn)路徑圖標(biāo)的縮放效果。
<ResourceDictionary
????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
????xmlns:controls="clr-namespace:WPFDevelopers.Controls">
????<ResourceDictionary.MergedDictionaries>
????????<ResourceDictionary?Source="Basic/ControlBasic.xaml"?/>
????</ResourceDictionary.MergedDictionaries>
????<Style
????????x:Key="WD.PathIcon"
????????BasedOn="{StaticResource?WD.ControlBasicStyle}"
????????TargetType="{x:Type?controls:PathIcon}">
????????<Setter?Property="Padding"?Value="0"?/>
????????<Setter?Property="FocusVisualStyle"?Value="{x:Null}"?/>
????????<Setter?Property="Focusable"?Value="False"?/>
????????<Setter?Property="Height"?Value="16"?/>
????????<Setter?Property="VerticalAlignment"?Value="Center"?/>
????????<Setter?Property="VerticalContentAlignment"?Value="Stretch"?/>
????????<Setter?Property="Foreground">
????????????<Setter.Value>
????????????????<Binding?Path="Foreground"?RelativeSource="{RelativeSource?Mode=FindAncestor,?AncestorType={x:Type?Control}}"?/>
????????????</Setter.Value>
????????</Setter>
????????<Setter?Property="Width"?Value="16"?/>
????????<Setter?Property="Template">
????????????<Setter.Value>
????????????????<ControlTemplate?TargetType="{x:Type?controls:PathIcon}">
????????????????????<Viewbox
????????????????????????Margin="{TemplateBinding?Padding}"
????????????????????????HorizontalAlignment="{TemplateBinding?HorizontalContentAlignment}"
????????????????????????VerticalAlignment="{TemplateBinding?VerticalContentAlignment}"
????????????????????????UseLayoutRounding="True">
????????????????????????<Path
????????????????????????????x:Name="PART_Path"
????????????????????????????Data="{TemplateBinding?Data}"
????????????????????????????Fill="{TemplateBinding?Foreground}"
????????????????????????????SnapsToDevicePixels="{TemplateBinding?SnapsToDevicePixels}"
????????????????????????????Stretch="Uniform"
????????????????????????????UseLayoutRounding="False"?/>
????????????????????</Viewbox>
????????????????</ControlTemplate>
????????????</Setter.Value>
????????</Setter>
????</Style>
????<Style
????????x:Key="WD.MiniPathIcon"
????????BasedOn="{StaticResource?WD.PathIcon}"
????????TargetType="{x:Type?controls:PathIcon}">
????????<Setter?Property="Height"?Value="10"?/>
????????<Setter?Property="Width"?Value="7"?/>
????</Style>
????<Style?BasedOn="{StaticResource?WD.PathIcon}"?TargetType="{x:Type?controls:PathIcon}"?/>
</ResourceDictionary>3)新增示例 PathIconExample.xaml 代碼如下:
<UniformGrid
????????????HorizontalAlignment="Center"
????????????VerticalAlignment="Center"
????????????Columns="6"
????????????Rows="2">
????????????<Button
????????????????Margin="4"
????????????????wd:ElementHelper.IsRound="True"
????????????????Style="{StaticResource?WD.PrimaryButton}">
????????????????<wd:PathIcon?Data="M682?256h256v256l-98-98-268?268-170-170-256?256-60-60?316-316?170?170?208-208z"?/>
????????????</Button>
????????????<Button
????????????????Margin="4"
????????????????wd:ElementHelper.IsRound="True"
????????????????Style="{StaticResource?WD.DangerPrimaryButton}">
????????????????<wd:PathIcon?Kind="Arrow"?/>
????????????</Button>
????????????<Button
????????????????Margin="4"
????????????????wd:ElementHelper.IsRound="True"
????????????????Style="{StaticResource?WD.DangerDefaultButton}">
????????????????<wd:PathIcon?Kind="SortArrow"?/>
????????????</Button>
????????????<Button
????????????????Margin="4"
????????????????wd:ElementHelper.IsRound="True"
????????????????Style="{StaticResource?WD.WarningDefaultButton}">
????????????????<wd:PathIcon?Kind="SmileyOutline"?/>
????????????</Button>
????????????<Button
????????????????Margin="4"
????????????????wd:ElementHelper.IsRound="True"
????????????????Style="{StaticResource?WD.DefaultButton}">
????????????????<wd:PathIcon?Kind="Replace"?/>
????????????</Button>
????????????<Button
????????????????Margin="4"
????????????????wd:Badge.HorizontalOffset="17"
????????????????wd:Badge.IsShow="True"
????????????????wd:Badge.VerticalOffset="8"
????????????????wd:ElementHelper.IsRound="True"
????????????????Style="{StaticResource?WD.SuccessDefaultButton}">
????????????????<wd:PathIcon?Kind="Home"?/>
????????????</Button>
????????????<Button
????????????????Margin="4"
????????????????wd:ElementHelper.IsRound="True"
????????????????Style="{StaticResource?WD.NormalButton}">
????????????????<wd:PathIcon?PathData="M682?256h256v256l-98-98-268?268-170-170-256?256-60-60?316-316?170?170?208-208z"?/>
????????????</Button>
????????????<Button?Margin="4"?Style="{StaticResource?WD.SuccessPrimaryButton}">
????????????????<wd:PathIcon?Kind="Arrow"?/>
????????????</Button>
????????????<Button?Margin="4"?Style="{StaticResource?WD.DangerPrimaryButton}">
????????????????<wd:PathIcon?Kind="SortArrow"?/>
????????????</Button>
????????????<Button
????????????????Margin="4"
????????????????wd:Badge.IsShow="True"
????????????????Style="{StaticResource?WD.WarningPrimaryButton}">
????????????????<wd:PathIcon
????????????????????Width="20"
????????????????????Height="20"
????????????????????Kind="SmileyOutline"?/>
????????????</Button>
????????????<Button?Margin="4"?Style="{StaticResource?WD.PrimaryButton}">
????????????????<wd:PathIcon?Kind="Replace"?/>
????????????</Button>
????????????<Button?Margin="4"?Style="{StaticResource?WD.SuccessPrimaryButton}">
????????????????<StackPanel?Orientation="Horizontal">
????????????????????<wd:PathIcon?Kind="Home"?/>
????????????????????<TextBlock?Margin="4,0"?Text="Home"?/>
????????????????</StackPanel>
????????????</Button>
????????</UniformGrid>效果圖

到此這篇關(guān)于基于WPF實(shí)現(xiàn)路徑圖標(biāo)控件的文章就介紹到這了,更多相關(guān)WPF路徑圖標(biāo)控件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#中的DataTable查詢實(shí)戰(zhàn)教程
這篇文章主要介紹了C#中的DataTable查詢實(shí)戰(zhàn)教程,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
c# 基于Titanium爬取微信公眾號(hào)歷史文章列表
這篇文章主要介紹了c# 基于Titanium爬取微信公眾號(hào)歷史文章列表,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下2021-03-03
C# 中如何利用lambda實(shí)現(xiàn)委托事件的掛接
在寫一個(gè)小程序的時(shí)候,碰到了這樣的問題,需要用委托來掛接事件,但是又想在這事件中使用局部的變量,而委托一旦定義好后,掛接方就沒有辦法再添加額外的形參了。那有沒有什么辦法,可以實(shí)現(xiàn)呢2013-07-07
CefSharp如何進(jìn)行頁面的縮放(Ctrl+滾輪)
CefSharp簡單來說就是一款.Net編寫的瀏覽器包,本文主要介紹了CefSharp如何進(jìn)行頁面的縮放,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-06-06

