如何用WPF技术打造一个智能长尾词验证码控件?

2026-03-31 10:091阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计830个文字,预计阅读时间需要4分钟。

如何用WPF技术打造一个智能长尾词验证码控件?

xml代码如下:One、创建CheckCode.xaml代码如下:ResourceDictionary xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml>

代码如下

如何用WPF技术打造一个智能长尾词验证码控件?

一、创建CheckCode.xaml代码如下

<ResourceDictionary xmlns="schemas.microsoft.com/winfx/2006/xaml/presentation"                     xmlns:x="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="schemas.microsoft.com/winfx/2006/xaml/presentation"              xmlns:x="schemas.microsoft.com/winfx/2006/xaml"              xmlns:mc="schemas.openxmlformats.org/markup-compatibility/2006"               xmlns:d="schemas.microsoft.com/expression/blend/2008"               xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"              xmlns:wpfdev="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:github.com/WPFDevelopersOrg

Gitee:gitee.com/WPFDevelopersOrg

以上就是基于WPF实现验证码控件的详细内容,更多关于WPF验证码控件的资料请关注自由互联其它相关文章!

本文共计830个文字,预计阅读时间需要4分钟。

如何用WPF技术打造一个智能长尾词验证码控件?

xml代码如下:One、创建CheckCode.xaml代码如下:ResourceDictionary xmlns=http://schemas.microsoft.com/winfx/2006/xaml/presentation xmlns:x=http://schemas.microsoft.com/winfx/2006/xaml>

代码如下

如何用WPF技术打造一个智能长尾词验证码控件?

一、创建CheckCode.xaml代码如下

<ResourceDictionary xmlns="schemas.microsoft.com/winfx/2006/xaml/presentation"                     xmlns:x="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="schemas.microsoft.com/winfx/2006/xaml/presentation"              xmlns:x="schemas.microsoft.com/winfx/2006/xaml"              xmlns:mc="schemas.openxmlformats.org/markup-compatibility/2006"               xmlns:d="schemas.microsoft.com/expression/blend/2008"               xmlns:local="clr-namespace:WPFDevelopers.Samples.ExampleViews"              xmlns:wpfdev="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:github.com/WPFDevelopersOrg

Gitee:gitee.com/WPFDevelopersOrg

以上就是基于WPF实现验证码控件的详细内容,更多关于WPF验证码控件的资料请关注自由互联其它相关文章!