前言:笔者最近用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 的变化

C# WPF 建立无边框(标题栏)的登录窗口的更多相关文章

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

    原文:WPF 创建无边框的圆角窗口 如题所述,在WPF中要创建一个没有边框且为圆角的窗体,有如下几步工作要进行: 第一步:去掉窗体默认样式的边框 首先将窗体的背景设为透明,将允许透明的属性设置为Tru ...

  2. WPF 解决无边框产生的相关问题

    原文:WPF 解决无边框产生的相关问题 最大化: 在设置WindowStyle="None" AllowsTransparency="True"后,最大化会覆盖 ...

  3. 使用WPF创建无边框窗体

    一.无边框窗口添加窗口阴影 实际上在WPF中添加无边框窗口的窗口阴影十分简单. 首先,设置WindowStyle="None"以及AllowsTransparency=" ...

  4. WPF遇到无边框的问题

    今天做一个项目采用的是WPF开发并且在制作窗体的时候用到无边框的问题,由于WPF开发和winform开发用点不一样, 遇到了这个问题就帮这个遇到问题的解决方法写下来方便以后忘记了和给一些遇到的朋友做一 ...

  5. wpf的无边框窗体透明

    本人做了3年的winform,来了新的工作,需要使用wpf.对于wpf,本人小白一个.说的不对的地方,请大家多多指导.... 今天先从wpf的窗体属性开始说起! 需要做的项目功能大概和电脑桌面类似,需 ...

  6. WPF系列:无边框窗口

    <Window x:Class="Ares.Animations.Window3" xmlns="http://schemas.microsoft.com/winf ...

  7. 【WPF】无边框窗体

    之前写了一个支持尺寸变换的无边框窗体的一个基窗体,代码如下: public class LBaseWindow : Window { /// <summary> /// 基窗体 /// & ...

  8. WPF实现无边框窗体拖拽右下角▲ 改变窗体大小【framwork4.0】 谢谢大家关注

    效果图:(右下角拖拽改变窗体大小) 第一步:添加xaml代码: <Border Name="ResizeBottomRight" MouseMove="Resize ...

  9. [WPF]建立自适应窗口大小布局的WinForm窗口

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

随机推荐

  1. tail-head

    [root@rusky]# tail test3 #不加参数默认显示全部内容 line line2 line3 line4 line5 line6 line7 line8 line9 line10 [ ...

  2. ios内存详解

    IOS以及Mac os都是基于Unix/linux改造出来的,而在内存管理方面也沿用了Unix/Linux的内存管理机制. 下面主要说的是IOS系统,有很多比较喜欢捣鼓的吧友肯定自己清理过机器的内存, ...

  3. WEB开发中常用的正则表达式

    在计算机科学中,正则表达式用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串.在WEB开发中,正则表达式通常用来检测.查找替换某些符合规则的字符串,如检测用户输入E-mai格式是否正确,采集符 ...

  4. jQuery学习资源参考教程网址推荐

    jQuery官方主页:http://jquery.comjQuery中文入门指南:http://www.k99k.com/jQuery_getting_started.htmljQuery使用手册:h ...

  5. Symfony2源码分析——启动过程2

    文章地址:http://www.hcoding.com/?p=46 上一篇分析Symfony2框架源码,探究Symfony2如何完成一个请求的前半部分,前半部分可以理解为Symfony2框架为处理请求 ...

  6. javascript闭包作用

    闭包的简单概念:闭包就是能够读取其他函数内部变量的函数. 函数内部的函数闭包的两个最大的作用读取函数内部的变量变量的值始终保持在内存中function A(){ var n=999; nAdd=fun ...

  7. LINUX 循环fork()

    #include <sys/types.h> #include <unistd.h> int main() {            for(int i = 0; i < ...

  8. Android学习笔记--存储方案(SharedPreference、文件IO)

    1. SharedPreference SharedPreference可以很容易的保存key-value对,通常用于保存配置信息.保存的步骤 1. 获得SharedPreferences对象 (最后 ...

  9. java事件响应方法汇总(容器类监听、监听器类、AbstractAction、反射)

    Java图形用户界面中,处理事件时所必须的步骤是: 1.创建接受响应的组件(控件)2.实现相关事件监听接口3.注册事件源的动作监听器4.事件触发时的事件处理 相应的可以通过以下的集中方式来作出事件响应 ...

  10. IOS 使用新浪微博SDK

    项目需要,测试了一下新浪微博SDK,现在记录一下初步使用过程. 1.下载导入新浪SDK. 2.去新浪开发者平台申请APPkey等. 3.工程中使用 4.在 APPDelegate中写两行 [Weibo ...