前面写了个简单的实现( http://blog.csdn.net/yysyangyangyangshan/article/details/9280439),不过效果不太好,各个点之间没有连接起来。这里增加连接各个按键。
其他代码不变,只改动PatternPasswordKeyboard类。

 /// <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>();//密码所在的控件 private List<Point> points = new List<Point>(); public PatternPasswordKeyboard()
{
InitializeComponent(); this.MouseUp += new MouseButtonEventHandler(MainWindow_MouseUp); this.MouseDown += new MouseButtonEventHandler(MainWindow_MouseDown);
} /// <summary>
/// 重置
/// </summary>
internal void PatternPasswordKeyboard_ResetPassword()
{
this.points.Clear(); this.password = string.Empty; foreach (KeyButton item in keyButtons)
{
item.SelfBacground = new SolidColorBrush(Colors.Transparent);
} this.InvalidateVisual();
} void MainWindow_MouseDown(object sender, MouseButtonEventArgs e)
{
points.Clear(); PatternPasswordKeyboard_ResetPassword(); 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;
} border.SelfBacground = new SolidColorBrush(Colors.Blue); keyButtons.Add(border); //将滑过的点保存起来
if (!password.Contains(key))
{
password += key; GeneralTransform generalTransform = border.ellipseBorder.TransformToAncestor(this); Point point = generalTransform.Transform(this.TranslatePoint(new Point(0,0),this)); points.Add(point); this.InvalidateVisual();
}
} protected override void OnRender(DrawingContext drawingContext)
{
base.OnRender(drawingContext); if (points.Count < 2)
{
return;
}
//使用画复合图形画出已经保存的点
Pen p = new Pen(new SolidColorBrush(Colors.Red), 10); GeometryGroup group = new GeometryGroup(); group.FillRule = FillRule.EvenOdd; LineGeometry myLineGeometry = null; for (int i = 0; i < points.Count;i++ )
{
if (i % 2 == 0)
{
if (myLineGeometry != null)
{
myLineGeometry.EndPoint = points[i];
} myLineGeometry = new LineGeometry(); myLineGeometry.StartPoint = points[i];
}
else
{
myLineGeometry.EndPoint = points[i]; group.Children.Add(myLineGeometry); if (i + 1 < points.Count)
{
myLineGeometry = new LineGeometry(); myLineGeometry.StartPoint = points[i]; group.Children.Add(myLineGeometry);
}
else
{
myLineGeometry = null;
}
}
} SolidColorBrush mySolidColorBrush = new SolidColorBrush(); drawingContext.DrawGeometry(mySolidColorBrush, new Pen(Brushes.Green, 10), group);
}
}

效果图:


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

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

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

    希望大家有这方面好的代码给提供下,谢谢了! 想用C#做一个和手机上一样的图形密码键盘,貌似这方面资料比较少,虽然winphone手机上也有但是网上也没有这方面的代码.只好用常规的思维去实现一下,当然是 ...

  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. APT攻防对抗

    APT(高级持续性威胁)攻击是指近年来,专业甚至是有组织和国家背景支持的黑客,针对重要目标和系统发起的一种攻击手段,主要特征有 1)持续性:攻击者为了重要的目标长时间持续攻击直到攻破为止.攻击成功用上 ...

  2. hdu 4778

    知道是状态压缩,但是不会做: 看题解学的: dp[i]表示现在状态是i,先手-后手的分数. #include<cstdio> #include<cstring> #includ ...

  3. Oracle11g密码区分大小写导致database link无法连接

    http://f.dataguru.cn/thread-128013-1-1.html Oracle11g的密码默认是区分大小写的,该特性通过初始化参数sec_case_sensitive_logon ...

  4. Ubuntu14.04下如何开启Mysql远程访问

    近来开发项目的需要,需要开启服务器下的Mysql远程访问权限(方法有很多),学习了一下,这里只演示个人觉得比较简单的一种方法. 对用户授权方法: 1. 在目录/etc/mysql下找到my.cnf,用 ...

  5. js构造函数

    使用函数做自动化 function createObj(nick, age){ var obj = { nick: nick, age: age, printName: function(){ con ...

  6. crtmpserver系列之一:流媒体概述

    阅读目录 概述 流媒体系统的组成 媒体文件封装 传输协议 回到顶部 概述 所谓流媒体按照字面意思理解就是像流一样的媒体,看起来像是废话.流媒体现在司空见惯,所以一般人大概不会有疑问.事实上在流媒体还没 ...

  7. Asynchronously with NSURLConnection

    NSString *urlAsString=@"http://www.apple.com"; NSURL *url=[NSURL URLWithString:urlAsString ...

  8. c#桥接模式(bridge结构模式)

    桥接模式(bridge结构模式)c#简单例子 在前面的玩家中每增加一个行为,就必须在每个玩家中都增加,通过桥接模式将行为提取出来了,减少变化 ? 1 2 3 4 5 6 7 8 9 10 11 12 ...

  9. JAVA web选型

    Web服务器是运行及发布Web应用的容器,只有将开发的Web项目放置到该容器中,才能使网络中的所有用户通过浏览器进行访问.开发Java Web应用所采用的服务器主要是与JSP/Servlet兼容的We ...

  10. 【原】CAVLC的个人理解

    4x4数据块经过预测.变换.量化后,非零系数主要集中在低频部分,而高频部分大部分是零.数据经过zig-zag扫描后,从左->右(低频->高频),DC系数附近的系数非常大,而高频的非零系数大 ...