前言:笔者最近用c#写WPF做了一个项目,此前未曾做过完整的WPF项目,算是一边学一边用,网上搜了不少资料,效率当然是不敢恭维的,有时会在一些很简单的问题上纠结很长时间,血与泪的教训可不少。

不过,正如电视剧某榜里的一句话:既然我活了下来,就不会白白活着!笔者怎么也算挣扎过了,有些经验与教训可以分享,趁着记忆深刻总结写下来。希望后来者少走弯路,提高工作效率。如果有写得不好的地方,希望读者能够指正,一起进步!

---------------------------------

今天先从登录窗口说起:

1. 效果图

先来看看效果图,简洁,风格统一,完全不会被Window操作系统主题的影响。

2. 实现方法

WPF做这样的窗口非常简单,只有需在窗口设计中设置两个属性,一个是AllowsTransparency, 设置为 Ture;  一个是 WindowStyle, 设置为 None。

注:是Window的属性,不要选中其他的控件。

另外,如果AllowsTransparency="True",那么 WindowStyle只能为 None, VS2015 已经做到连动设置,只要勾选AllowsTransparency,后一个也跟着变了。但 VS2008 还是需要用户分别设置,不然会报错。

还有一个问题不得不提,AllowsTransparency="True" 之后就无法使用 WindowsFormsHost控件了,因为就算用了,WFH里的任何控件也是透明无法显示出来的,比如ReportViewer!

3.窗口任意空白地方实现鼠标拖拽

标题栏上有最大化最小化和关闭的按钮,其中在登录窗口我们一般是不会使用最大化按钮的。可是不得不说,标题栏还有一个很实用的作用,就是可以拖拽整个窗口,用户只要单击标题栏不放,就可以拖到桌面的任何地方。如今把标题栏隐藏之后,该如何弥补呢?

为窗口添加一个 MouseLeftButtonDown 的事件,代码如下:

        private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e){try{this.DragMove();}catch { }}

这样就OK了!

注:网上有些示例里,没有用 try{}catch{},而只有一行代码

this.DragMove();

如果在登录窗口,只有那么几个控件和事件的话,应该也是无大碍的。

在这里笔者有个小小的经验必须分享一下:

由于在主界面里也使用了这种无标题栏的窗口,鼠标在Gridview上操作时,经常会引发异常崩溃。

所以笔者认为最好加 try...catch... 避免异常,哪怕是登录窗口也不例外。

4. 输入密码后按回车登录

很多网站会注意这种情况,输入密码后回车,系统就可以登录,这就是良好的用户体验。(当然,也有些网站不注意用户体验,用户必须用鼠标去点击登录的)

其实在密码框添加一个 KeyDown 事件就可以

        private void txt_Pwd_KeyDown(object sender, KeyEventArgs e){switch (e.Key){case Key.Enter:btn_login_Click(btn_login, null);break;default:break;}}    

So easy !

5. 按Enter(回车)跳到下一控件

提到回车登录,顺便提一下,有些人不喜欢输入用户名后,又要用鼠标移到密码框,又键盘又鼠标,比如笔者。

事实上 Tab键 可以让用户在比较简单的界面摆脱鼠标,不过要注意在窗口设计时调好控件的 TabIndex 顺序。

当然在此基础上也可以加一个 Enter 设置的功能,只要在后台代码重写窗口的 OnKeyDown 事件,如下:

        //按下回车后跳入下一个控件protected override void OnKeyDown(KeyEventArgs e){if (e.Key == Key.Enter){// MoveFocus takes a TraveralReqest as its argument.TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Next);// Gets the element with keyboard focus.UIElement elementWithFocus = Keyboard.FocusedElement as UIElement;// Change keyboard focus.if (elementWithFocus != null){elementWithFocus.MoveFocus(request);}e.Handled = true;}base.OnKeyDown(e);}

6. 运行时打开登录窗口

登录窗口毕竟不是主窗口,登录后要关闭的,所以Startup的路径不是登录窗口,但登录的时候是不能打开主窗口的,如果用户关闭登录窗口,退出程序。

实现方法:

项目下有一个App.xaml文件,Startup 指向主窗口的路径,然后打开后台代码 App.xaml.cs,重写OnStartup事件,判断一下登录窗口的 DialogResult 如果返回ture,就正常打开主窗口,如果为 false,则关闭整个程序。代码:

        //打开登录窗口,成功后进入主窗口protected override void OnStartup(StartupEventArgs e){try{OneInstanceOnly();//仅运行一个实例
//#if !DEBUG// 运行登录窗口Application.Current.ShutdownMode = System.Windows.ShutdownMode.OnExplicitShutdown;LoginWindow window = new LoginWindow();bool? dialogResult = window.ShowDialog();if (Utils.IsTrue(dialogResult)){base.OnStartup(e);Application.Current.ShutdownMode = ShutdownMode.OnMainWindowClose;}else{this.Shutdown();}
//#endif
            }catch (Exception ex){UIUtils.ShowException(ex);}}

留意 ShutdownMode 的变化

转载于:https://www.cnblogs.com/EasyInvoice/p/5242294.html

C# WPF 建立无边框(标题栏)的登录窗口相关推荐

  1. C# WPF 建立无边框(标题栏)的登录窗口的示例

    前言:笔者最近用c#写WPF做了一个项目,此前未曾做过完整的WPF项目,算是一边学一边用,网上搜了不少资料,效率当然是不敢恭维的,有时会在一些很简单的问题上纠结很长时间,血与泪的教训可不少. 不过,正 ...

  2. WPF 创建无边框的圆角窗口

    第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为True,即:Background="Transparent"  AllowsTransparenc ...

  3. wpf button无边框_中国式新房无玄关?客厅真不缺这点面积!

    来源|合肥飞墨设计 id:feimoshejihf 以前经常会说一些奇葩户型改造,现在的新房奇葩的户型渐渐少了,但是还是不可避免的有一些小问题,比如入户门正对卫生间,入户无玄关等不痛不痒的问题,虽说不 ...

  4. 利用WPF建立自适应窗口大小布局的WinForm窗口

    编写WinForm程序时,都会碰到一个问题.就是WinForm窗口在不同分辨率下的大小问题.举例说明,你编写的WinForm窗口在1024×768下是合适.匀称的.不过,如果用户的计算机的分辨率为14 ...

  5. 拖动无边框的登入窗口

    最初使用一个Rectangle,并设置Z值来捕捉MouseLeftButtonDown事件,但是不管在它之上或是之下的TextBox都无法用鼠标进入编辑状态. 给Window添加MouseLeftBu ...

  6. qt widget设置边框_Qt开源作品16-通用无边框拖动拉伸

    ## 一.前言 相信各位CS结构开发的程序员,多多少少都遇到过需要美化界面的事情,一般都不会采用系统的标题栏,这样就需要无边框标题栏窗体,默认的话无边框的标题栏都不支持拉伸和拖动的,毕竟去掉了标题栏则 ...

  7. html制作网易云音乐登录系统,JavaScript实现[网易云音乐Web站登录窗口]拖拽功能...

    说明 你可能发现有很多网站他们的登录窗口或者说是登录框是可以拖动的, 更有甚者他们的站点提示框都可以拖动, 你也许可能会对这个功能的实现感兴趣, 那么这篇文章可能会对你有所帮助!具体的网站示例以 网易 ...

  8. 无边框窗体的移动(winform/wpf)

    WinForm 引入命名空间 using System.Runtime.InteropServices;无边框移动[DllImport("user32.dll")]public s ...

  9. WPF无边框拖动、全屏、缩放

    原文:WPF无边框拖动.全屏.缩放 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/lwwl12/article/details/78059361 先看效果 ...

最新文章

  1. SAP freelancer夫妻并不难!你也可以!
  2. 在RHEL4上安装subversion1.4.2
  3. 做为一名IT新人,必了解程序员与产品经理的恩怨情仇
  4. Android底层开发之Audio HAL Android Audio Overview
  5. Pycharm中的Debug工具以及简单的使用方法
  6. GDCM:二个DICOM文件的diff差异的测试程序
  7. oracle各种查询语句
  8. 仿hotmail收件人弹层: onkeyup事件无法捕获到回车按键, 用onkeydown事件捕获额外处理回车键...
  9. android通用对话框,android-所有活动中的“通用”对话框
  10. linux软件装错了,Linux安装软件时的错误解决
  11. 详解netty原理分析
  12. 【魔兽世界】WLK版本的常规宏教程
  13. python海贼王logo_中年大叔学编程-Python下载海贼王漫画图片
  14. 调皮捣蛋的孩子--十大负面测试用例
  15. 微信群控系统源码的实现原理,核心源码实现,核心框架。
  16. 【第12天】给定一个X进制数字A,请你把它转换为十进制打印 | 进制转换
  17. [日语二级词汇]日语二级必会汉字总结10
  18. matlab回车键,在Matlab中启动.exe文件后,以编程方式按一下回车键
  19. Typora配色方案
  20. k8s各组件的端口说明

热门文章

  1. JAVA注释、标识符、常量与变量、数据类型和数据类型转换
  2. 逆向教程2 某信营业厅
  3. 安装win和xp双系统 若干问题
  4. 【数据结构/C语言版】【图】邻接表存储
  5. HBase初识之学生心得总结
  6. 计算机的资源管理器是电脑上的哪个图标,计算机资源管理器怎么打开
  7. 欢迎光临阿里云栖大会SAP展区(C区301)!
  8. 2022年R2移动式压力容器充装操作证考试题库及模拟考试
  9. matlab扩展的欧几里得算法_最大公约数问题(欧几里得算法)
  10. 沧小海的《xilinx的A7系列芯片资源学习笔记》之第一部分:I/O BANK(三)