`
he91_com
  • 浏览: 411422 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

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

想用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-Diagram-Designer:WPF图表设计器源代码

    通过深入研究WPF-Diagram-Designer的源代码(如WPF-Diagram-Designer-master文件夹中的内容),开发者不仅可以学习到如何在WPF中构建复杂的图形界面,还可以了解到图形编辑器的设计原理和实现细节,对于提升图形应用...

    gong-wpf-dragdrop:GongSolutions.WPF.DragDrop库是WPF的拖放框架

    GongSolutions.WPF.DragDrop 一种易于使用的WPF拖放框架。 支持.NET Framework 4.5+和.NET Core 3(3.0和3.1) 产品特点 与MVVM一起使用:拖放的逻辑可以放在ViewModel中。 无需在代码背后放置任何代码,而是将...

    通用WPF主题控件包rubyer-wpf-master

    通用WPF主题控件包rubyer-wpf-master是一款专为Windows Presentation Foundation (WPF) 应用程序设计的开源UI框架。它提供了丰富的主题和控件,旨在帮助开发者快速构建美观且用户友好的应用程序界面。在2.0.0版本中...

    wpf-mvvm-DeskTop-Sample-master_C#_WPF_wpf客户端zfs_

    标题中的“wpf-mvvm-DeskTop-Sample-master”表明这是一个关于WPF(Windows Presentation Foundation)桌面应用程序的示例项目,使用了MVVM(Model-View-ViewModel)设计模式。这个项目是用C#编程语言编写的,面向的...

    gong-wpf-dragdrop, GongSolutions.WPF.DragDrop 库是WPF的拖动'n'拖放框架.zip

    gong-wpf-dragdrop, GongSolutions.WPF.DragDrop 库是WPF的拖动'n'拖放框架 简介GongSolutions.WPF.DragDrop 库是一个易于使用的拖拉'n'拖放框架。特性使用 MVVM: 拖放逻辑可以放在ViewModel中。 代码不需要放在in中...

    WPF-ControlBase:Wpf封装的自定义控件资源库

    **动画封装**:WPF-ControlBase 包含了一系列的动画效果封装,使得开发者可以轻松地在应用中添加动态效果,提升用户体验。这些动画可能包括淡入淡出、滑动、旋转、缩放等常见动画类型,通过这些预定义的动画,开发者...

    WPF-Blockly-master.zip

    1. **图形化编程**:WPF-Blockly的核心功能是图形化编程,它允许用户通过拖放编程块来创建代码,而不是传统的文本输入方式。这种方式对初学者特别友好,因为它降低了编程的门槛,使得编程更加直观和易于理解。图形化...

    WPF-Depot:WPF

    "WPF-Depot: WPF"这个项目可能是一个包含多种WPF示例、教程或者代码库的集合,用于帮助开发者更好地理解和学习WPF技术。 WPF的核心是XAML(eXtensible Application Markup Language),这是一种XML方言,用于声明式...

    wpf-math:.NET库,用于使用WPF框架的LaTeX排版样式呈现数学公式

    WPF数学 WPF-Math是一个.NET库,用于WPF框架,使用LaTeX排版样式呈现数学公式。 入门 使用WPF-Math的最简单方法是在XAML文件中呈现静态公式,如下所示。 &lt; Window xss=removed clr-namespace:WpfMath.Controls;...

    vavatech-rittal-wpf-mvvm:Przykładyze szkolenia WPF MVVM

    标题 "vavatech-rittal-wpf-mvvm:Przykładyze szkolenia WPF MVVM" 指的是一个关于WPF(Windows Presentation Foundation)框架与MVVM(Model-View-ViewModel)设计模式的培训示例项目。这个项目可能是由vavatech或...

    Wpf-glTF-testing.zip

    3. 3D渲染:WPF的Viewport3D和Model3DGroup等元素被用来构建和展示3D场景。开发者可能使用了GeometryModel3D来表示模型的几何形状,并结合Material和Light来创建逼真的视觉效果。 此项目可能适用于以下场景: 1. ...

    WPF-Demo:WPF示例源代码

    2. **数据绑定**:WPF支持强大的数据绑定机制,可以直接将UI元素与后台数据模型关联,实现视图与模型的自动同步,简化了数据驱动的应用程序开发。 3. **控件库**:WPF提供了丰富的内置控件,如按钮、文本框、列表...

    WPF-ControlBase-master.zip

    **WPF(Windows Presentation Foundation)控制库详解** WPF,全称为Windows Presentation Foundation,是微软.NET Framework中的一个组件,主要用于构建丰富的、具有图形用户界面(GUI)的应用程序。它引入了全新...

    bootstrap-wpf-style-master 样式

    1. **XAML**:WPF 的标记语言,用于定义用户界面布局和样式。在 Bootstrap-WPF 项目中,开发者会使用 XAML 来引用 Bootstrap 的 CSS 和 JavaScript 文件,并应用对应的类和属性来实现相应的样式效果。 2. **CSS**:...

    WPF-Samples-master_WPF基本sample_

    WPF的基本空间历程,使用.net core3.0.1版本

    WPF编程宝典:使用C# 2012和.NET 4.5 第4版 PDF与源码

    《WPF编程宝典:使用C# 2012和.NET 4.5 第4版》是一本全面深入探讨Windows Presentation Foundation (WPF) 的技术书籍,它以C# 2012和.NET Framework 4.5为开发语言和平台。这本书详细介绍了如何利用WPF创建现代化、...

    WPF做的简单的图案密码键盘

    用WPF实现的一个简单的图案密码键盘,功能还没实现完整,主要是和大家交流下,争取完善。 文章:http://blog.csdn.net/yysyangyangyangshan/article/details/9280439

    VS2015-WPF-Theme:手工制作的WPF主题,为Visual Studio 2015外观提供对AvalonDock的支持

    在【标签】中虽然没有具体的标签,但我们可以推断出一些关键点:WPF开发、UI/UX设计、AvalonDock库的使用、以及与Visual Studio 2015风格的兼容性。 在【压缩包子文件的文件名称列表】中,"VS2015-WPF-Theme-master...

    actipro-wpf-controls-20.1.1.zip

    此程序从官网上下载的安装包,没有进行任何破解,如果要破解,看我另外一个资源ControlRegisterHelp那个

    OpenControls.Wpf-master

    《OpenControls.Wpf-master:深度探索WPF框架控件》 在Windows Presentation Foundation(WPF)的世界里,开发者们能够创建出美观且功能丰富的桌面应用程序。OpenControls.Wpf-master项目,正如其名,是一个专注于...

Global site tag (gtag.js) - Google Analytics