前面写了个简单的实现( 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. ASP.NET在主题中添加CSS文件

    ASP.NET在主题中添加CSS文件 在ASP.NET中,可以使用CSS来控制页面上HTML元素和ASP.NET控件的皮肤.如果在主题文件夹中添加了CSS文件,则在页面应用主题时也会自动应用CSS. ...

  2. Java中堆和栈创建对象的区别

    http://blog.csdn.net/hbhhww/article/details/8152838

  3. ANDROID_MARS学习笔记_S01原始版_013_广播机制二

    一.代码1.xml(1)main.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayo ...

  4. EqualsBuilder和HashCodeBuilder

    package com.osc.demo; import java.util.List; import org.apache.commons.lang.builder.EqualsBuilder; i ...

  5. 通过Hibernate将数据库在myeclipse中逆向生成

    1.首先准备好数据库. 2.在MyEclipse的右上角切换透视图,切换到MyEclipse Database Explorer 3.在最左边点击右键,选择New(也就是新建一个数据库连接),然后编写 ...

  6. idea快捷方式

    1. [常规] Ctrl + Shift + Enter,语句完成 "!",否定完成,输入表达式时按 "!"键 Ctrl + E,最近的文件 Ctrl+Shif ...

  7. c while 循环

    c代码: #include <stdio.h> int main(void){ unsigned long sum=1UL; unsigned int j=1U; unsigned ; p ...

  8. python的whl文件安装

    python27win32安装:https://www.python.org/downloads/   下载2.7的        安装中一路下一步即可: 配置python系统环境变量: 新建: PY ...

  9. 如何使用GetManifestResourceStream

    在做开发时想要从程序集中加载一个xml文件数据,可是在运行后确取不到值,值始终是null. 代码如下: Stream ss = this.GetType().Assembly.GetManifestR ...

  10. 【HDOJ】1258 Sum It Up

    典型的深搜,剪枝的时候需要跳过曾经搜索过的相同的数目,既满足nums[i]=nums[i-1]&&visit[i-1]==0,visit[i-1]==0可以说明该点已经测试过. #in ...