WPF 实现验证码控件
Posted dotNET跨平台
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 实现验证码控件的主要内容,如果未能解决你的问题,请参考以下文章