前面写了个简单的实现(
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-Diagram-Designer的源代码(如WPF-Diagram-Designer-master文件夹中的内容),开发者不仅可以学习到如何在WPF中构建复杂的图形界面,还可以了解到图形编辑器的设计原理和实现细节,对于提升图形应用...
GongSolutions.WPF.DragDrop 一种易于使用的WPF拖放框架。 支持.NET Framework 4.5+和.NET Core 3(3.0和3.1) 产品特点 与MVVM一起使用:拖放的逻辑可以放在ViewModel中。 无需在代码背后放置任何代码,而是将...
通用WPF主题控件包rubyer-wpf-master是一款专为Windows Presentation Foundation (WPF) 应用程序设计的开源UI框架。它提供了丰富的主题和控件,旨在帮助开发者快速构建美观且用户友好的应用程序界面。在2.0.0版本中...
标题中的“wpf-mvvm-DeskTop-Sample-master”表明这是一个关于WPF(Windows Presentation Foundation)桌面应用程序的示例项目,使用了MVVM(Model-View-ViewModel)设计模式。这个项目是用C#编程语言编写的,面向的...
gong-wpf-dragdrop, GongSolutions.WPF.DragDrop 库是WPF的拖动'n'拖放框架 简介GongSolutions.WPF.DragDrop 库是一个易于使用的拖拉'n'拖放框架。特性使用 MVVM: 拖放逻辑可以放在ViewModel中。 代码不需要放在in中...
**动画封装**:WPF-ControlBase 包含了一系列的动画效果封装,使得开发者可以轻松地在应用中添加动态效果,提升用户体验。这些动画可能包括淡入淡出、滑动、旋转、缩放等常见动画类型,通过这些预定义的动画,开发者...
1. **图形化编程**:WPF-Blockly的核心功能是图形化编程,它允许用户通过拖放编程块来创建代码,而不是传统的文本输入方式。这种方式对初学者特别友好,因为它降低了编程的门槛,使得编程更加直观和易于理解。图形化...
"WPF-Depot: WPF"这个项目可能是一个包含多种WPF示例、教程或者代码库的集合,用于帮助开发者更好地理解和学习WPF技术。 WPF的核心是XAML(eXtensible Application Markup Language),这是一种XML方言,用于声明式...
WPF数学 WPF-Math是一个.NET库,用于WPF框架,使用LaTeX排版样式呈现数学公式。 入门 使用WPF-Math的最简单方法是在XAML文件中呈现静态公式,如下所示。 < Window xss=removed clr-namespace:WpfMath.Controls;...
标题 "vavatech-rittal-wpf-mvvm:Przykładyze szkolenia WPF MVVM" 指的是一个关于WPF(Windows Presentation Foundation)框架与MVVM(Model-View-ViewModel)设计模式的培训示例项目。这个项目可能是由vavatech或...
3. 3D渲染:WPF的Viewport3D和Model3DGroup等元素被用来构建和展示3D场景。开发者可能使用了GeometryModel3D来表示模型的几何形状,并结合Material和Light来创建逼真的视觉效果。 此项目可能适用于以下场景: 1. ...
2. **数据绑定**:WPF支持强大的数据绑定机制,可以直接将UI元素与后台数据模型关联,实现视图与模型的自动同步,简化了数据驱动的应用程序开发。 3. **控件库**:WPF提供了丰富的内置控件,如按钮、文本框、列表...
**WPF(Windows Presentation Foundation)控制库详解** WPF,全称为Windows Presentation Foundation,是微软.NET Framework中的一个组件,主要用于构建丰富的、具有图形用户界面(GUI)的应用程序。它引入了全新...
1. **XAML**:WPF 的标记语言,用于定义用户界面布局和样式。在 Bootstrap-WPF 项目中,开发者会使用 XAML 来引用 Bootstrap 的 CSS 和 JavaScript 文件,并应用对应的类和属性来实现相应的样式效果。 2. **CSS**:...
《WPF编程宝典:使用C# 2012和.NET 4.5 第4版》是一本全面深入探讨Windows Presentation Foundation (WPF) 的技术书籍,它以C# 2012和.NET Framework 4.5为开发语言和平台。这本书详细介绍了如何利用WPF创建现代化、...
WPF的基本空间历程,使用.net core3.0.1版本
用WPF实现的一个简单的图案密码键盘,功能还没实现完整,主要是和大家交流下,争取完善。 文章:http://blog.csdn.net/yysyangyangyangshan/article/details/9280439
【标题】"WPF-JJDown-v1.234.0" 提示我们这是一个基于Windows Presentation Foundation(WPF)的应用程序,名为JJDown。版本号v1.234.0表明这是该软件的第1次重大更新,第234次次要更新或修复。这通常意味着它经历了...
在【标签】中虽然没有具体的标签,但我们可以推断出一些关键点:WPF开发、UI/UX设计、AvalonDock库的使用、以及与Visual Studio 2015风格的兼容性。 在【压缩包子文件的文件名称列表】中,"VS2015-WPF-Theme-master...
此程序从官网上下载的安装包,没有进行任何破解,如果要破解,看我另外一个资源ControlRegisterHelp那个