希望大家有这方面好的代码给提供下,谢谢了!

想用C#做一个和手机上一样的图形密码键盘,貌似这方面资料比较少,虽然winphone手机上也有但是网上也没有这方面的代码。只好用常规的思维去实现一下,当然是比较简单的,希望各路高手能给一些好的建议,这篇文章算是抛砖引玉吧,用WPF实现。

思路如下:

    使用常用控件从最简单的图案绘制,然后放在相应的控件上,利用鼠标的Move事件,判断鼠标滑过哪些控件,然后将控件上的对应密码的数字收集,最终形成密码。

具体实现:

    工程名:TestPicturePassword

一般常见的图案密码按键都是圆形的,所以利用重绘事件画一个圆形。

 /// <summary>
/// 按键形状类
/// </summary>
public class KeyBorder:Border
{
public Brush SelfBacground
{
get { return (Brush)GetValue(SelfBacgroundProperty); } set
{
SetValue(SelfBacgroundProperty, value); this.InvalidateVisual();
}
} public static readonly DependencyProperty SelfBacgroundProperty =
DependencyProperty.Register("SelfBacground", typeof(Brush), typeof(KeyBorder), new UIPropertyMetadata()); /// <summary>
/// 使绘制区域为自定义形状,这里是圆形
/// </summary>
/// <param name="dc"></param>
protected override void OnRender(System.Windows.Media.DrawingContext dc)
{
base.OnRender(dc); //画矩形的
//SolidColorBrush mySolidColorBrush = new SolidColorBrush(); //mySolidColorBrush.Color = Colors.LimeGreen; //Pen myPen = new Pen(Brushes.Blue, 10); //Rect myRect = new Rect(0, 0, 500, 500); //dc.DrawRectangle(mySolidColorBrush, myPen, myRect); //画圆形
EllipseGeometry ellipse = new EllipseGeometry(new Point(40, 40), 30, 30);//piont中的参数最好要设置属性进行外部设置 ellipse.RadiusX = 30; ellipse.RadiusY = 30; RectangleGeometry rect = new RectangleGeometry(new Rect(50, 50, 50, 20), 5, 5); GeometryGroup group = new GeometryGroup(); group.FillRule = FillRule.EvenOdd; group.Children.Add(ellipse); //group.Children.Add(rect); dc.DrawGeometry(SelfBacground, new Pen(Brushes.Green, 2), group);
}
}

再将这个圆形放在另一个容器中,将容器控件的背景设置为透明。

<UserControl x:Class="TestPicturePassword.KeyButton"
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:TestPicturePassword"
mc:Ignorable="d" Background="Transparent"
BorderThickness="0">
<Grid>
<local:KeyBorder x:Name="ellipseBorder" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>
</Grid>
</UserControl>
  /// <summary>
/// KeyButton.xaml 的交互逻辑
/// </summary>
public partial class KeyButton : UserControl
{
public Brush SelfBacground
{
get { return (Brush)GetValue(SelfBacgroundProperty); } set
{
SetValue(SelfBacgroundProperty, value); this.ellipseBorder.SelfBacground = value;
}
} public static readonly DependencyProperty SelfBacgroundProperty =
DependencyProperty.Register("SelfBacground", typeof(Brush), typeof(UserControl), new UIPropertyMetadata()); public KeyButton()
{
InitializeComponent();
}
}

最终将按键按要求排布,

如图,

<UserControl x:Class="TestPicturePassword.PatternPasswordKeyboard"
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:TestPicturePassword"
mc:Ignorable="d"
d:DesignHeight="300" d:DesignWidth="300">
<Grid HorizontalAlignment="Center" Name="grid1" VerticalAlignment="Center"
Background="Transparent">
<Grid.Resources>
<!--键盘按钮的样式-->
<Style x:Key="PasswordBorderStyle" TargetType="local:KeyButton">
<Setter Property="Background" Value="Transparent"/>
<Setter Property="SelfBacground" Value="Gray"/>
<Setter Property="Width" Value="80" />
<Setter Property="Height" Value="80" />
<Setter Property="Margin" Value="10"/>
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="VerticalAlignment" Value="Stretch"/>
<EventSetter Event="Mouse.MouseMove" Handler="BorderMouseMove"/>
</Style>
</Grid.Resources> <Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
<ColumnDefinition Width="auto" />
</Grid.ColumnDefinitions>
<local:KeyButton Grid.Row="0" Grid.Column="0" x:Name="border1" Style="{StaticResource PasswordBorderStyle}" Tag="1" />
<local:KeyButton Grid.Row="0" Grid.Column="1" x:Name="border2" Style="{StaticResource PasswordBorderStyle}" Tag="2" />
<local:KeyButton Grid.Row="0" Grid.Column="2" x:Name="border3" Style="{StaticResource PasswordBorderStyle}" Tag="3" />
<local:KeyButton Grid.Row="1" Grid.Column="0" x:Name="border4" Style="{StaticResource PasswordBorderStyle}" Tag="4" />
<local:KeyButton Grid.Row="1" Grid.Column="1" x:Name="border5" Style="{StaticResource PasswordBorderStyle}" Tag="5" />
<local:KeyButton Grid.Row="1" Grid.Column="2" x:Name="border6" Style="{StaticResource PasswordBorderStyle}" Tag="6" />
<local:KeyButton Grid.Row="2" Grid.Column="0" x:Name="border7" Style="{StaticResource PasswordBorderStyle}" Tag="7" />
<local:KeyButton Grid.Row="2" Grid.Column="1" x:Name="border8" Style="{StaticResource PasswordBorderStyle}" Tag="8" />
<local:KeyButton Grid.Row="2" Grid.Column="2" x:Name="border9" Style="{StaticResource PasswordBorderStyle}" Tag="9" />
</Grid>
</UserControl>

后台代码,在这里实现密码收集。

  /// <summary>
/// PatternPasswordKeyboard.xaml 的交互逻辑
/// </summary>
public partial class PatternPasswordKeyboard : UserControl
{
public string password = string.Empty;//最终密码 private bool isMouseDonw = false;//控制只有鼠标按下的滑动才有效 private List<KeyButton> keyButtons = new List<KeyButton>();//密码所在的控件 public PatternPasswordKeyboard()
{
InitializeComponent(); this.MouseUp += new MouseButtonEventHandler(MainWindow_MouseUp); this.MouseDown += new MouseButtonEventHandler(MainWindow_MouseDown);
} /// <summary>
/// 重置
/// </summary>
internal void PatternPasswordKeyboard_ResetPassword()
{
this.password = string.Empty; foreach (KeyButton item in keyButtons)
{
item.SelfBacground = new SolidColorBrush(Colors.Transparent);
}
} void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
{
isMouseDonw = true;
} void MainWindow_MouseUp(object sender, MouseButtonEventArgs e)
{
isMouseDonw = false;
} private void BorderMouseMove(object sender, MouseEventArgs e)
{
if (!isMouseDonw)
{
return;
} KeyButton border = sender as KeyButton; if (border == null)
{
return;
} string key = border.Tag.ToString(); if (string.IsNullOrEmpty(key))
{
return;
} if (!password.Contains(key))
{
password += key;
} border.SelfBacground = new SolidColorBrush(Colors.Blue); keyButtons.Add(border);
}
}

测试代码:

如图,

<Window x:Class="TestPicturePassword.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:TestPicturePassword"
Title="MainWindow" xmlns:my="clr-namespace:TestPicturePassword">
<Grid> <Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions> <local:PatternPasswordKeyboard Grid.Row="0" x:Name="pkeyboard"/> <StackPanel Orientation="Horizontal" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="您输入的密码是:" VerticalAlignment="Center" FontSize="20" FontFamily="Microsoft YaHei" Margin="0,0,20,0"/>
<TextBox Height="50" HorizontalAlignment="Left" Name="textBox1" VerticalAlignment="Top" Width="291" Margin="0,0,50,0"/>
<Button Content="重 置" Height="50" HorizontalAlignment="Left" Name="button1" VerticalAlignment="Top" Width="110" Click="button1_Click" />
</StackPanel>
</Grid>
</Window>
   /// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent(); this.MouseUp += new MouseButtonEventHandler(MainWindow_MouseUp);
} void MainWindow_MouseUp(object sender, MouseButtonEventArgs e)
{
this.textBox1.Text = pkeyboard.password;
} /// <summary>
/// 重置
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, RoutedEventArgs e)
{
this.pkeyboard.PatternPasswordKeyboard_ResetPassword();
}
}

效果图

代码下载:http://download.csdn.net/detail/yysyangyangyangshan/5724829

WPF-21:WPF实现仿安卓的图案密码键盘(初级)的更多相关文章

  1. WPF-21:WPF实现仿安卓的图案密码键盘(改进)

    前面写了个简单的实现( http://blog.csdn.net/yysyangyangyangshan/article/details/9280439),不过效果不太好,各个点之间没有连接起来.这里 ...

  2. WPF开发随笔收录-仿安卓Toast

    一.前言 在项目中,经常需要用到消息提醒功能,在以前接触安卓开发那会使用过Toast,于是打算在WPF上也来模仿一个,话不多说,撸起袖子干起来! 二.正文 1.首先新建一个工程,工程的目录如下 2.编 ...

  3. WPF系列教程——(一)仿TIM QQ界面 - 简书

    原文:WPF系列教程--(一)仿TIM QQ界面 - 简书 TIM QQ 我们先来看一下TIM QQ长什么样,整体可以将界面分为三个部分 TIM QQ 1. 准备 阅读本文假设你已经有XAML布局的基 ...

  4. WPF C#截图功能 仿qq截图

    原文:WPF C#截图功能 仿qq截图 先上效果图 源码下载地址:http://download.csdn.net/detail/candyvoice/9788099 描述:启动程序,点击窗口butt ...

  5. 【WPF】WPF截屏

    原文:[WPF]WPF截屏 引言 .NET的截图控件在网上流传得不多啊,难得发现一个精品截图控件( 传送门),但是无奈是winform的.后来又找到一个周银辉做的WPF截图(继续传送门),发现截屏是实 ...

  6. 【WPF】wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例

    原文:[WPF]wpf用MultiBinding解决Converter需要动态传参的问题,以Button为例       用Binding并通过Converter转换的时候,可能偶尔会遇到传参的问题, ...

  7. 基于托管的C++来使用WPF - Using WPF with Managed C++

    基于托管的C++来使用WPF - Using WPF with Managed C++ Posted by Zeeshan Amjad This article was originally publ ...

  8. WPF ”真正的“高仿QQ

    时常可以在各种论坛 博客 看到 各种所谓的 高仿QQ. 说实话 越看越想笑呢.(PS:纯粹的 抨击 那些 不追求 UI 完美主义者) 例如:       本次模仿 采用 C# WPF XAML , 总 ...

  9. WPF实现截图(仿微信截图)

    WPF开发者QQ群: 340500857  | 微信群 -> 进入公众号主页 加入组织 每日一笑 肚子疼,去厕所排便,结果什么都没拉出来.看着自己坐在马桶上痛苦又努力却一无所获的样子,仿佛看到了 ...

随机推荐

  1. OCX控件在IE中无法侦测到键盘消息( MFC ActiveX Control in IE Doesn't Detect Keystrokes)

    症状描述: Accelerator keys, such as ARROW keys, are first received by the message pump of the ActiveX co ...

  2. 一int考虑什么类型的多少字节

    一int表示的字节数? 问题是,我们经常得到的答案4. 但int究竟占多少个字节,却跟你的机器环境有关. As you can see, the typical data type sizes mat ...

  3. javascripte (三) 改变html图像

    <script> function changeImage(){ element=document.getElementById("myimage") if (elem ...

  4. ZeroClipboard插件:兼容各浏览器网页复制功能

    常规利用JS编写的网页复制功能只对IE有效,无法做到兼容其它浏览器,代码如下: function copyToClipBoard(){ var clipBoardContent="" ...

  5. ROOT android 原则。 基于(zergRush)

    从: http://bbs.gfan.com/android-2996211-1-1.html 须要ROOT的同学请去上面的地址下载. a.控制手机创建个暂时目录,然后把zergRush脚本写入此目录 ...

  6. [Android学习笔记]子线程更新UI线程方法之Handler

    关于此笔记 不讨论: 1.不讨论Handler实现细节 2.不讨论android线程派发细节 讨论: 子线程如何简单的使用Handler更新UI 问题: android开发时,如何在子线程更新UI? ...

  7. Oracle varchar2最大支持长度(转)

    oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, nu ...

  8. C语言数据结构----递归的应用(八皇后问题的具体流程)

    本节主要讲八皇后问题的基本规则和递归回溯算法的实现以及具体的代码实现和代码分析. 转载请注明出处.http://write.blog.csdn.net/postedit/10813257 一.八皇后问 ...

  9. 应届GIS硕士求职经验总结

    记录一下作为一个GIS应届毕业生在帝都找工作的历程吧,之后的经历可能丰富多彩,可能萎靡不振,但这一次走过来了就是这一次的.希望以史为鉴,各位客官也能有所收获. 定位 我们这一届的"烟酒生&q ...

  10. Android数据库高手秘籍(一)——SQLite命令

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/38461239 要想熟练地操作不论什么一个数据库.最最主要的要求就是要懂SQL语言, ...