基于WPF實現(xiàn)驗證碼控件
代碼如下
一、創(chuàng)建CheckCode.xaml代碼如下
<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?TargetType="{x:Type?controls:CheckCode}"?BasedOn="{StaticResource?ControlBasicStyle}"> ????????<Setter?Property="Background"?Value="{x:Null}"/> ????????<Setter?Property="Width"?Value="100"/> ????????<Setter?Property="Height"?Value="40"/> ????????<Setter?Property="Cursor"?Value="Hand"/> ????????<Setter?Property="Template"> ????????????<Setter.Value> ????????????????<ControlTemplate?TargetType="{x:Type?controls:CheckCode}"> ????????????????????<Image?x:Name="PART_Image"?Stretch="Fill"?Source="{TemplateBinding?ImageSource}"/> ????????????????</ControlTemplate> ????????????</Setter.Value> ????????</Setter> ????</Style> </ResourceDictionary>
二、CheckCode.cs代碼如下
using?System; using?System.Windows; using?System.Windows.Controls; using?System.Windows.Input; using?System.Windows.Media; using?System.Windows.Media.Imaging; namespace?WPFDevelopers.Controls { ????[TemplatePart(Name?=?ImageTemplateName,?Type?=?typeof(Image))] ????public?class?CheckCode?:?Control ????{ ????????private?const?string?ImageTemplateName?=?"PART_Image"; ????????private?Image?_image; ????????private?Size?_size?=?new?Size(70,?23); ????????private?const?string?strCode?=?"abcdefhkmnprstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ23456789";? ????????public?static?readonly?DependencyProperty?ImageSourceProperty?=? ????????????DependencyProperty.Register("ImageSource",?typeof(ImageSource),?typeof(CheckCode),new?PropertyMetadata(null)); ????????///?<summary> ????????///?隨機生成的驗證碼 ????????///?</summary> ????????public?ImageSource?ImageSource ????????{ ????????????get?{?return?(ImageSource)GetValue(ImageSourceProperty);?} ????????????set?{?SetValue(ImageSourceProperty,?value);?} ????????} ????????///?<summary> ????????///?字體顏色 ????????///?</summary> ????????public?Brush?SizeColor ????????{ ????????????get?{?return?(Brush)GetValue(SizeColorProperty);?} ????????????set?{?SetValue(SizeColorProperty,?value);?} ????????} ????????public?static?readonly?DependencyProperty?SizeColorProperty?= ????????????DependencyProperty.Register("SizeColor",?typeof(Brush),?typeof(CheckCode),?new?PropertyMetadata(DrawingContextHelper.Brush)); ????????public?CheckCode() ????????{ ????????????this.Loaded?+=?CheckCode_Loaded; ????????} ????????private?void?CheckCode_Loaded(object?sender,?RoutedEventArgs?e) ????????{ ????????????ImageSource?=?CreateCheckCodeImage(CreateCode(4),?(int)this.ActualWidth,?(int)this.ActualHeight); ????????} ????????public?override?void?OnApplyTemplate() ????????{ ????????????base.OnApplyTemplate(); ????????????_image?=?GetTemplateChild(ImageTemplateName)?as?Image; ????????????if?(_image?!=?null) ????????????????_image.PreviewMouseDown?+=?_image_PreviewMouseDown; ????????} ????????private?void?_image_PreviewMouseDown(object?sender,?MouseButtonEventArgs?e) ????????{ ????????????if?(!IsLoaded) ????????????????return; ????????????ImageSource?=?CreateCheckCodeImage(CreateCode(4),?(int)this.ActualWidth,?(int)this.ActualHeight); ????????} ????????private?string?CreateCode(int?strLength) ????????{ ????????????var?_charArray?=?strCode.ToCharArray(); ????????????var?randomCode?=?""; ????????????int?temp?=?-1; ????????????Random?rand?=?new?Random(Guid.NewGuid().GetHashCode()); ????????????for?(int?i?=?0;?i?<?strLength;?i++) ????????????{ ????????????????if?(temp?!=?-1) ????????????????????rand?=?new?Random(i?*?temp?*?((int)DateTime.Now.Ticks)); ????????????????int?t?=?rand.Next(strCode.Length?-?1); ????????????????if?(!string.IsNullOrWhiteSpace(randomCode)) ????????????????{ ????????????????????while?(randomCode.ToLower().Contains(_charArray[t].ToString().ToLower())) ????????????????????????t?=?rand.Next(strCode.Length?-?1); ????????????????} ????????????????if?(temp?==?t) ????????????????????return?CreateCode(strLength); ????????????????temp?=?t; ????????????????randomCode?+=?_charArray[t]; ????????????} ????????????return?randomCode; ????????} ????????private?ImageSource?CreateCheckCodeImage(string?checkCode,?int?width,?int?height) ????????{ ????????????if?(string.IsNullOrWhiteSpace(checkCode)) ????????????????return?null; ????????????if?(width?<=?0?||?height?<=?0) ????????????????return?null; ????????????var?drawingVisual?=?new?DrawingVisual(); ????????????var?random?=?new?Random(Guid.NewGuid().GetHashCode()); ????????????using?(DrawingContext?dc?=?drawingVisual.RenderOpen()) ????????????{ ????????????????dc.DrawRectangle(Brushes.White,?new?Pen(SizeColor,?1),?new?Rect(_size)); ????????????????var?formattedText?=?DrawingContextHelper.GetFormattedText(checkCode,color:SizeColor,?flowDirection:?FlowDirection.LeftToRight,textSize:20,?fontWeight:?FontWeights.Bold); ????????????????dc.DrawText(formattedText,?new?Point((_size.Width?-?formattedText.Width)?/?2,?(_size.Height?-?formattedText.Height)?/?2)); ????????????????for?(int?i?=?0;?i?<?10;?i++) ????????????????{ ????????????????????int?x1?=?random.Next(width?-?1); ????????????????????int?y1?=?random.Next(height?-?1); ????????????????????int?x2?=?random.Next(width?-?1); ????????????????????int?y2?=?random.Next(height?-?1); ????????????????????dc.DrawGeometry(Brushes.Silver,?new?Pen(Brushes.Silver,?0.5D),?new?LineGeometry(new?Point(x1,?y1),?new?Point(x2,?y2))); ????????????????} ????????????????for?(int?i?=?0;?i?<?100;?i++) ????????????????{ ????????????????????int?x?=?random.Next(width?-?1); ????????????????????int?y?=?random.Next(height?-?1); ????????????????????SolidColorBrush?c?=?new?SolidColorBrush(Color.FromRgb((byte)random.Next(0,?255),?(byte)random.Next(0,?255),?(byte)random.Next(0,?255))); ????????????????????dc.DrawGeometry(c,?new?Pen(c,?1D),?new?LineGeometry(new?Point(x?-?0.5,?y?-?0.5),?new?Point(x?+?0.5,?y?+?0.5))); ????????????????} ????????????????dc.Close(); ????????????} ????????????var?renderBitmap?=?new?RenderTargetBitmap(70,?23,?96,?96,?PixelFormats.Pbgra32); ????????????renderBitmap.Render(drawingVisual); ????????????return?BitmapFrame.Create(renderBitmap); ????????} ????} }
三、新建CheckCodeExample.cs代碼如下
<UserControl?x:Class="WPFDevelopers.Samples.ExampleViews.CheckCodeExample" ?????????????xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" ?????????????xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ?????????????xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"? ?????????????xmlns:d="http://schemas.microsoft.com/expression/blend/2008"? ?????????????xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews" ?????????????xmlns:wpfdev="https://github.com/WPFDevelopersOrg/WPFDevelopers" ?????????????mc:Ignorable="d"? ?????????????d:DesignHeight="450"?d:DesignWidth="800"> ????<UniformGrid?Rows="2"?Columns="2"> ????????<wpfdev:CheckCode?SizeColor="LimeGreen"/> ????????<wpfdev:CheckCode?SizeColor="Red"/> ????????<wpfdev:CheckCode?SizeColor="DodgerBlue"/> ????????<wpfdev:CheckCode?SizeColor="HotPink"/> ????</UniformGrid> </UserControl>
效果預覽
源碼地址如下
Github:https://github.com/WPFDevelopersOrg
Gitee:https://gitee.com/WPFDevelopersOrg
以上就是基于WPF實現(xiàn)驗證碼控件的詳細內(nèi)容,更多關(guān)于WPF驗證碼控件的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C#開發(fā)WinForm清空DataGridView控件綁定的數(shù)據(jù)
本文詳細講解了C#開發(fā)WinForm清空DataGridView控件綁定數(shù)據(jù)的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-03-03P/Invoke之C#調(diào)用動態(tài)鏈接庫DLL示例詳解
這篇文章主要為大家介紹了P/Invoke之C#調(diào)用動態(tài)鏈接庫DLL示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03C#實現(xiàn)通過winmm.dll控制聲音播放的方法
這篇文章主要介紹了C#實現(xiàn)通過winmm.dll控制聲音播放的方法,很實用的功能,需要的朋友可以參考下2014-08-08C#處理類型和二進制數(shù)據(jù)轉(zhuǎn)換并提高程序性能
這篇文章介紹了C#處理類型和二進制數(shù)據(jù)轉(zhuǎn)換并提高程序性能的方法,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04C#客戶端程序調(diào)用外部程序的3種實現(xiàn)方法
這篇文章主要給大家介紹了關(guān)于C#客戶端程序調(diào)用外部程序的3種實現(xiàn)方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。2018-04-04