今天就跟大家聊聊有关如何在C# 中利用WPF 建立一个无边框的登录窗口,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
实现方法
WPF做这样的窗口非常简单,只有需在窗口设计中设置两个属性,一个是AllowsTransparency, 设置为 Ture; 一个是 WindowStyle, 设置为 None。
注:是Window的属性,不要选中其他的控件。
另外,如果AllowsTransparency="True",那么 WindowStyle只能为 None, VS2015 已经做到连动设置,只要勾选AllowsTransparency,后一个也跟着变了。但 VS2008 还是需要用户分别设置,不然会报错。
还有一个问题不得不提,AllowsTransparency="True" 之后就无法使用 WindowsFormsHost控件了,因为就算用了,WFH里的任何控件也是透明无法显示出来的,比如ReportViewer!
标题栏上有最大化最小化和关闭的按钮,其中在登录窗口我们一般是不会使用最大化按钮的。可是不得不说,标题栏还有一个很实用的作用,就是可以拖拽整个窗口,用户只要单击标题栏不放,就可以拖到桌面的任何地方。如今把标题栏隐藏之后,该如何弥补呢?
为窗口添加一个 MouseLeftButtonDown 的事件,代码如下:
private void Window_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { try { this.DragMove(); } catch { } }
这样就OK了!
注:网上有些示例里,没有用 try{}catch{},而只有一行代码
this.DragMove();
如果在登录窗口,只有那么几个控件和事件的话,应该也是无大碍的。
在这里笔者有个小小的经验必须分享一下:
由于在主界面里也使用了这种无标题栏的窗口,鼠标在Gridview上操作时,经常会引发异常崩溃。
所以笔者认为最好加 try...catch... 避免异常,哪怕是登录窗口也不例外。
很多网站会注意这种情况,输入密码后回车,系统就可以登录,这就是良好的用户体验。(当然,也有些网站不注意用户体验,用户必须用鼠标去点击登录的)
其实在密码框添加一个 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 !
提到回车登录,顺便提一下,有些人不喜欢输入用户名后,又要用鼠标移到密码框,又键盘又鼠标,比如笔者。
事实上 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); }
登录窗口毕竟不是主窗口,登录后要关闭的,所以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); } }
看完上述内容,你们对如何在C# 中利用WPF 建立一个无边框的登录窗口有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。