原文:WPF中实现先登录后启动主程序的方法

 我觉得先登录后启动应用主程序是一个很经典的问题,基本上如果要写一个应用程序都会用到这个的小环节。我在这个问题上挣扎了大半天才找到解决方案,我的实现方法我觉得有点不正宗,如果有哪位高手知道更好的方法欢迎留言指导!!

  首先来说一下传统C#在WinForm中的实现方法,基本上是在Main函数中根据第一个启动窗口的DialogResult来判断是否实例第二个窗口,DialogResult是在第一个窗口中根据登录情况来设置的。代码如下

主函数代码:



static class Program



{



    [STAThread]



    static void Main()



    {



        try



        {



            Application.EnableVisualStyles();



            Application.SetCompatibleTextRenderingDefault(false);



            frmLogin frm = new frmLogin(); //登录



            if (frm.ShowDialog() == DialogResult.OK)



            {



                Application.Run(new frmMain()); //主窗体



            }



            else



            {



                Application.Exit();



            }



        }



        catch (Exception ex)



        {



            MessageBox.Show(ex.Message, "系统登陆", MessageBoxButtons.OK, MessageBoxIcon.Stop);



            Application.Exit();



        }



    }



}

  第一个登录窗口中设置DialogResult的代码:

  this.DialogResult = DialogResult.OK;

  this.Close();

  From: http://www.itc8.cn/a/bianchengleyuan/2011/0126/216.html

  参考WinFrom中的这个基本想法,在WPF中实现。我重写了OnStartup函数:

protected override void OnStartup(StartupEventArgs e)



        {



            base.OnStartup(e);



 



            Login loginWindow = new Login();



            loginWindow.ShowDialog();



            result = loginWindow.DialogResult;



            username = loginWindow.UserName;



            if (true == result)



            {



                MainWindow main = new MainWindow(username);



                main.ShowDialog();



            }   



        } //这里需要注意的一点就是上面要用ShowDialog(),而不能直接调用Show(),Show()是不会返回任何结果的,只有用ShowDialog()才能渠道DialogResult

  死活都是只能启动第一个窗口登录,然后第二个窗口无法呈现出来。调试后发现main窗口已经实例化了但是ShowDialog()貌似完全不起作用。纠结了。。

  这个问题的可能原因有:

  1. MainWindow也就是我要创建的第二个主窗口没有实例化成功;

  2. DialogResult错误导致没有进入MainWindow的实例和显示过程;

  3. 第一个窗口在作祟。

  经过调试排除第一、二中可能,那么肯定就是第一个窗口设置不对或者哪里出问题了。Google了一下别人WPF的方法,发现有一篇文章中提到了需要将WPF的ShutDownMode设置为OnExplicitShutdown才行,试了一下,果然生效了!只需要很简单的在Main主函数修改Application的ShutdownMode,修改代码如下

public static void Main()



        {



            PFM.GUI.App.App app = new PFM.GUI.App.App();



            app.ShutdownMode = ShutdownMode.OnExplicitShutdown;



            app.Run();



        }

  让我们来看看这个ShutdownMode是何方神圣。ShutdownMode可以设置为一个ShutdownMode 枚举值,包括三种:OnLastWindowClose、OnMainWindowClose、OnExplicitShutdown,默认值是OnLastWindowClose。如果将 ShutdownMode 设置为 OnLastWindowClose,则 Windows Presentation Foundation (WPF) 会在应用程序中的最后一个窗口关闭时隐式调用 Shutdown,即使任何当前已经实例化的窗口被设置为主窗口也是如此(MSDN:
http://goo.gl/fAyrD )。最后一句是关键:即使任何当前已经实例化的窗口被设置为主窗口也是如此。因为WPF中默认将在Application中实例化的第一个 Window 对象的引用自动设置为MainWindow。

  也就是说当我们实例化第一个窗口的时候,它被认为是一个MainWindow,所以当它被关闭的时侯WPF就已经隐式调用了ShutDown所以之后我们在怎么实例化窗口都是徒劳。这就是为什么把ShutdownMode设为显示关闭这样就可以避免上面的问题了。需要注意的是在OnStartUp中记得调用App.Shutdown()来关闭Application哦

WPF中实现先登录后启动主程序的方法的更多相关文章

  1. WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常

    WPF中实例化Com组件,调用组件的方法时报System.Windows.Forms.AxHost+InvalidActiveXStateException的异常 在wpf中封装Com组件时,调用组件 ...

  2. 总结:WPF中ResourceDictionary资源文件的查找和遍历方法

    原文:总结:WPF中ResourceDictionary资源文件的查找和遍历方法 一.查找包含制定关键字的资源 ResourceDictionary GetThemeDictionary()     ...

  3. ecmall用户登录后自动退出解决方法

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  4. 关于WPF中RichTextBox失去焦点后如何保持高亮显示所选择的内容

    其实很简单,只要将容器控件中的附加属性FocusManager.IsFocusScope设为True就可以了 下面是个简单的用例: <Window x:Class="WpfApplic ...

  5. WPF 中使用MVVM模式后,找回ListBox中的ListBoxItem元素

    ListBoxItem lstitem = this.list.ItemContainerGenerator.ContainerFromItem(m) as ListBoxItem; 其中this.l ...

  6. WPF中选择文件和选择文件夹的方法

    最近从winform转WPF,遇到了各种各样的问题.然而网上的关于WPF的资料少之又少,甚至连基本的文件选择操作,百度搜索的首页都没有一个比较好的方法.所以,踩了几个坑之后,我把我得到的方法分享给大家 ...

  7. 基于C#在WPF中使用斑马打印机进行打印【转】

    原文链接:http://ju.outofmemory.cn/entry/132476 最近在项目中接手了一个比较有挑战性的模块——用斑马打印机将需要打印的内容打印出来.苦苦折腾了两天,总算有所收获,就 ...

  8. WPF换肤之三:WPF中的WndProc

    原文:WPF换肤之三:WPF中的WndProc 在上篇文章中,我有提到过WndProc中可以处理所有经过窗体的事件,但是没有具体的来说怎么可以处理的. 其实,在WPF中,要想利用WndProc来处理所 ...

  9. WPF 中图片的加载 ,使用统一资源标识符 (URI)

    在wpf中,设置图片路径有2种方法: 1.xaml文件中,指定路径 <Button Name=" HorizontalAlignment="Right" Verti ...

随机推荐

  1. gcc的stdcall扩展

    MSVC上: 如果是函数调用约定直接就写 __stdcall 之类的就行了 如果是gcc上: 函数的扩展调用约定要这样写 __attribute__((__stdcall__)),默认为__attri ...

  2. setTimeout()使用

    Basic setTimeout() Example setTimeout(function() {       // Do something after 5 seconds }, ); Tip:  ...

  3. 【转】Android C程序也可自己手动用交叉编译器编译 (

    原文网址:http://blog.sina.com.cn/s/blog_533074eb0101ez5q.html Android 编译环境 本身比较复杂,且不像普通的编译环境:只有顶层目录下才有 M ...

  4. linux 挂载 镜像文件

    挂接命令(mount) 命令格式: mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype指定文件系统的类型,通常不必指定.mount会 ...

  5. UESTC_树上的距离 2015 UESTC Training for Graph Theory<Problem E>

    E - 树上的距离 Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Subm ...

  6. Windows多线程同步系列之四-----信号量

    信号量说实话自己没怎么使用过.书上大概这样说,信号量设置一个资源访问计数.当该计数值大于0的时候,该信号量对象 为有信号状态,当该计数值等于0的时候,该信号量对象为无信号状态. 我们来查几个主要的AP ...

  7. 图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活

    图片旋转+剪裁js插件(兼容各浏览器) « 张鑫旭-鑫空间-鑫生活 图片旋转+剪裁js插件(兼容各浏览器) by zhangxinxu from http://www.zhangxinxu.com 本 ...

  8. html&CSS初学

    <link href="https://fonts.gdgdocs.org/css?family=Lobster" rel="stylesheet" ty ...

  9. Oracle Enterprise linux 7 安装Oracle11gR2

    一.修改主机名和IP地址: [root@localhost Desktop]# cat /etc/hosts127.0.0.1 localhost.localdomain localhost 192. ...

  10. android视频录制、另一部手机实时观看方案

    最近调研android视频录制.另一部手机实时观看,大致有以下几种思路. 1. android手机充当服务器,使用NanoHTTPD充当服务器,另一部手机或者pc通过输入http://手机的ip:80 ...