如何在C# 中利用WPF 建立一个无边框的登录窗口
创始人
2024-12-26 08:42:51
0次

 实现方法

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

如何在C# 中利用WPF 建立一个无边框的登录窗口

注:是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 !

按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);
    }

运行时打开登录窗口

登录窗口毕竟不是主窗口,登录后要关闭的,所以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);
      }
    }

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...