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

首先来说一下传统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哦。

转载于:https://www.cnblogs.com/imjustice/archive/2011/05/08/2198114.html

WPF中实现先登录后启动主程序的方法相关推荐

  1. Maven在pom文件中添加资源插件后,src/main/resource目录中的文件编译后不拷贝解决方法。

    在pom文件中添加以下资源插件后 <!--添加的资源插件--> <build><resources><resource><directory> ...

  2. vue中后台管理登录后的token管理

    在做后台管理系统的时候,登录后token管理很重要.上代码,有瑕疵,有待改善,见谅. import Vue from 'vue' import Router from 'vue-router' imp ...

  3. uni-app:处理微信浏览器中授权微信登录后,无法正常回退问题

    一.情景 在微信浏览器中,需要使用用户微信的code数据,因此采用了"location.href"获取微信授权信息的方式来实现授权登录,并且在重定向页面中获取code,完成操作后需 ...

  4. 在maven的pom.xml文件中导入tomcat插件后启动tomcat7报错

    在maven启用tomcat有两种方式,一种是集成本地的tomcat,另一种是在pom.xml文件中插入tomcat插件,本人小白初学第一种方式运行成功后,开始实验第二种方式,运行后出现报错 原因是端 ...

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

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

  6. 解决使用360安装windows更新后启动慢的方法

    问题描述: 重装电脑后安装了360并将要打的补丁都打上了,还优化了系统设置,但是重启后电脑变得启动缓慢,尤其是360很久才启动出来. 解决方法: 1.使用Win+R调出运行. 2.输入msconfig ...

  7. firefox linux脚本启动,在Linux终端中使用后台运行模式启动程序的方法

    这是一个篇幅不长但是十分有用的教程,可以帮助你在终端启动一个Linux应用程序,并且使终端窗口不会丢失焦点. 我们有很多可以在Linux系统中打开一个终端窗口的方法,这取决于你的选择以及你的桌面环境. ...

  8. linux ssh 登录后 空闲断开 解决方法

    我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,我们还的需要重新连接,感觉很麻烦,总结一下解决此问题的方法 方法一 远程服务器上修改, /etc/ssh/sshd_conf ...

  9. Anaconda中Jupyter notebook打开后闪退问题解决方法

    问题描述:今天打开Jupter后弹出来终端命令行界面后闪退,上网查了一下好像是没有配置好文件 解决办法:打开cmd,输入下面代码 jupyter notebook --generate-config ...

最新文章

  1. XML文档DOM、SAX、STAX解析方式
  2. 教育的本质是人点亮人
  3. zTree实现单独选中根节点中第一个节点
  4. 1.12 Java数组使用binarySearch()方法查找指定元素
  5. 安装jdk配置环境、cmd命令行测试环境变量配置是否正确及运行java程序、安装IDEA编写代码测试
  6. windows查看局域网内所有已使用的IP
  7. 韦根协议c语言,基于STM8系列的韦根协议门禁源代码 1.STM8系列开发源代码; 2.已做门禁开发:韦根协议刷卡门禁控制源代码; - 下载 - 搜珍网...
  8. oracle通过日期函数求年龄的大小
  9. 【读书笔记】《向上管理:如何正确汇报工作》
  10. 7.camera驱动06-自己实现v4l2驱动-虚拟摄像头
  11. linux驱动开发:PWM驱动编写
  12. RGBD相机的标定和图像配准
  13. mit计算机33门课程_440多门免费在线编程和计算机科学课程,您可以在2月开始
  14. Go1.9 安全map用法
  15. 初级程序员和高级程序员的区别(转)
  16. h5获取当前浏览器ip和城市名称
  17. openvpen最新安卓中文版_Plotagraph安卓中文版下载-Plotagraph安卓手机版下载V3.6.9最新版-西西软件下载...
  18. loadrunner入门篇 - Vuser发生器
  19. 国际化RFID射频常用协议标准
  20. No module named ‘pip._internal.vcs.git

热门文章

  1. 【数据挖掘笔记四】数据仓库和联机分析处理
  2. SpeedNet: Learning the Speediness in Videos
  3. 1.2 初窥输入输出、控制语句
  4. 计算机组成原理——总线结构
  5. Java实现定时调度的三种方法
  6. Java 技术篇-借助自定义对象实现函数返回多个不同类型的值实例演示
  7. MySQL 数据库利用alter语句修改表字段属性实例演示,如何拓展表字段长度,sql语句修改表字段名称和类型
  8. 单点效率测试工具:F8秒表
  9. VS Code(Visual Studio Code)编辑器的常用设置
  10. [watevrCTF-2019]Pickle Store