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