• WPF教程七:通过App.xaml来了解Application类都能干什么


      这个章节来了解Application类,我考虑了一晚上决定跳过控件类相关的学习,因为控件如果只是入门的话每个控件F12跳过去看一下属性、事件就能大致了解的差不多,而且控件比较多,每个都这样看一遍,感觉意义不大。同时控件的使用一般又同时包含了,资源、样式、触发器、模板、绑定、列表控件的话,可能还包含列表虚拟化和数据虚拟化。所以想了一下。打算先讲Application类。

      教程的第一篇我们从hello world开始了解什么是程序。它是如何编译、生成和运行的。现在这一个篇从App.xaml讲解Application类中能包含哪些东西,。这个Application类有哪些应用场景。

    App.xaml 里包含什么

    我们新创建一个WPF的程序,默认什么代码也不改动的情况下双击程序代码中的App.xaml。我们看到如下代码:

    <Application x:Class="ApplicationLifeCycle.App"
                 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                 xmlns:local="clr-namespace:ApplicationLifeCycle"
                 StartupUri="MainWindow.xaml"> 
        <Application.Resources>
             
        </Application.Resources>
    </Application>

    这里就是我们当前程序的入口部分了,如果需要修改入口则需要通过再解决方案上的程序集工程上右键=》属性=》应用程序=》启动对象=》设置为对应的。但是这里默认我们不修改。因为App.xaml这里已经提供了很丰富的功能。够我们目前使用。

    Application下XAML属性再这个系列的第一篇博客里有详细讲过这些,我们主要讲Application的属性,我们用鼠标单击代码上的Application对象按下F12,我们截取几个必要常用的属性来讲,其他的属性感兴趣了都可以花时间看一下。

      我们就讲这些里面一部分常用的,剩下的建议以我们同样的分析思路,去观察一下其他的。

    1)首先我们看程序启动后的第一步。通过OnStartUp()方法做启动参数检查。

    我们通过OnStartUp()方法的重写来区分不同启动参数,可以让程序干很多不同的事情,我们打开任务管理器=》Name列右键点击=》勾选显示Command line,位置如下:

     

    这样我们就可以看到当前很多其他程序,都是由启动参数的,启动参数按空格分割,有的程序会有一组参数,所以对我们来说,启动参数同样也是很重要的东西。不管是单例,还是让程序启动不同的功能,启动参数就是软件功能解耦的第一步。

    我们找到上上个截图的OnStartup方法,我们在App.xaml.cs里重写他,代码如下,并在解决方案下的程序集右键=》属性=》左侧列表选择调试=》命令行参数这里添加对应的调试参数,我们这里设置用空格分割一句话,这样我们就可以调试了,F5启动。

     

    using System.Text;
    using System.Windows;
    
    namespace ApplicationLifeCycle
    {
        /// <summary>
        /// App.xaml 的交互逻辑
        /// </summary>
        public partial class App : Application
        { 
    
            protected override void OnStartup(StartupEventArgs e)
            {
                base.OnStartup(e); 
                StringBuilder sb = new StringBuilder();
                foreach (var item in e.Args)
                {
                    sb.Append(item);
                } 
                MessageBox.Show($"args length as {e.Args.Length},args content as {sb.ToString()}");
              
            }
        }
    }

     

     我们看到了参数是4行,内容是-hello duwenong Mastery C#。这样我们通过重写OnStartup就可以实现参数对不同的参数做不同的处理。 

    2)用户注销,但是程序正在处理关键任务,通过重写OnSessionEnding()来提示当前工作尚未结束。

    我们通过重写OnSessionEnding()可以在重要工作没做完但是,用户选择关机、重启或注销电脑时提示用户我们有任务尚未结束。

     private bool _unsavedData = false;
            public bool UnsavedData
            {
                get { return _unsavedData; }
                set
                {
                    _unsavedData = value;
                }
            }
    
            protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
            {
                base.OnSessionEnding(e);
                //假设某些线程未完成保存,把UnsaveData设置为True
                UnsavedData = true;
                if (UnsavedData)
                {
                    e.Cancel = true;
                    MessageBox.Show($"我们的数据尚未保存完毕,{e.ReasonSessionEnding} 将丢失数据。");
                }
            }

    这样再程序开启时,用户选择注销电脑或者重启关机等其他操作时,会弹出一个提示框,提示用户数据未保存完成。是否强制执行他的操作。

    3)默认启动那个Window窗体。我们使用StartupUri设置可以修改默认启动的Window窗体。

     

     这样启动的就是我们新创建的Window1.

    4)通过ShutdownMode修改程序默认的关闭方式。

     

    1.OnExplicitShutdown 这个方法比较特殊,他是除非通过代码调用了Application.Shutdown()方法,否则即使所有窗口都关闭了,程序仍然驻留再后台。
    2.OnLastWindowClose 这个是默认的值,只要至少有一个窗口存在,应用程序就保持运行状态,但是注意如果关闭了主窗口,MainWindow扔就指向当时的窗体,需要代码切换MainWindow到其他窗体
    3.OnMainWindowClose 这个是只要主窗体还处于打开状态,应用程序就保持运行,如果主窗体关闭进程就退出。

    5)使用Application.Current访问当前Application的实例

     private void GetCurrentWindowListButton_Click(object sender, RoutedEventArgs e)
            {
                Window mainWindow = Application.Current.MainWindow;
                foreach (var item in Application.Current.Windows)
                {
                    var title = ((Window)item).Title;
                }
    
            }

    我们使用代码获取当前打开的所有window的标题。

    Application的属性和方法目前就写这么多,其他的大家可以自己F12看一下并尝试写一下代码,资源和资源的查找虽然也是Application下的。但是我觉得这点要要出来单独讲,所以就不写在这里啦。

       

    我创建了一个C#相关的交流群。用于分享学习资料和讨论问题。欢迎有兴趣的小伙伴:QQ群:542633085

  • 相关阅读:
    一张一驰,文武之道
    关于“未能加载……”和“web.config”
    DotText学习心得_1
    windows服务与事务
    AWR报告生成
    Java EE启示录
    跨入安全的殿堂读《Web入侵安全测试与对策》感悟
    用VS2005写Loadrunner测试脚本
    List of Free Programming books
    硬盘基础知多少
  • 原文地址:https://www.cnblogs.com/duwenlong/p/14603158.html
Copyright © 2020-2023  润新知