zoukankan      html  css  js  c++  java
  • WPF-21:WPF实现仿安卓的图案密码键盘(改进)

    前面写了个简单的实现( 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

  • 相关阅读:
    pandas的简单使用
    java搭建web从0-1(第一步:创建web工程)
    android通过命令行安装sdk
    iOS8不能通过itms-services协议下载安装app
    date命令转换日期命令提示date: illegal time format
    mac通过命令行获取证书和配置文件过期时间
    jenkin 不必要的Execute shell执行失败,导致jenkins都失败的解决
    命令行执行jenkins,构建job(可传递参数)
    Eclipse启动分析。。
    java非web应用修改 properties/xml配置文件后,无需重启应用即可生效---自动加载
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3181756.html
Copyright © 2011-2022 走看看