WPF 实现验证码控件
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                WPF 实现验证码控件
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                WPF開發者QQ群
此群已滿340500857?,請加新群458041663
?? ??? 由于微信群人數太多入群請添加小編微信號
?yanjinhuawechat 或 W_Feng_aiQ?邀請入群
?需備注WPF開發者?
01
—
代碼如下
一、創建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>02
—
效果預覽
鳴謝素材提供者 - 屈越
源碼地址如下
Github:https://github.com/WPFDevelopersOrg
Gitee:https://gitee.com/WPFDevelopersOrg
WPF開發者QQ群:?340500857?|?458041663
Github:https://github.com/WPFDevelopersOrg
出處:https://www.cnblogs.com/yanjinhua
版權:本作品采用「署名-非商業性使用-相同方式共享 4.0 國際」許可協議進行許可。
轉載請著名作者 出處 https://github.com/WPFDevelopersOrg
掃一掃關注我們,
更多知識早知道!
點擊閱讀原文可跳轉至源代碼
總結
以上是生活随笔為你收集整理的WPF 实现验证码控件的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: 都是基于.NET平台,WPF能取代Win
 - 下一篇: 4. 堪比JMeter的.Net压测工具