通过App.xaml理解wpf中的Application类

 更新时间:2021年04月02日 09:50:14   作者:杜文龙  
这篇文章主要介绍了通过App.xaml理解wpf中的Application类,帮助大家更好的理解和学习使用c# wpf,感兴趣的朋友可以了解下
(福利推荐:【腾讯云】服务器最新限时优惠活动,云服务器1核2G仅99元/年、2核4G仅768元/3年,立即抢购>>>:9i0i.cn/qcloud

(福利推荐:你还在原价购买阿里云服务器?现在阿里云0.8折限时抢购活动来啦!4核8G企业云服务器仅2998元/3年,立即抢购>>>:9i0i.cn/aliyun

  这个章节来了解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>

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

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下的。但是我觉得这点要要出来单独讲,所以就不写在这里啦。

以上就是通过App.xaml理解wpf中的Application类的详细内容,更多关于理解wpf中的Application类的资料请关注程序员之家其它相关文章!

相关文章

  • C#实现添加多行文本水印到Word文档

    C#实现添加多行文本水印到Word文档

    一般情况下,在Word中添加文字水印仅支持添加一个文本字样的水印,由于对不同文档的设计要求,需要在Word文档中添加平铺水印效果。本文将介绍如何来实现该水印效果的方法,感兴趣的可以了解一下
    2022-07-07
  • C#对Json进行序列化和反序列化

    C#对Json进行序列化和反序列化

    这篇文章介绍了C#对Json进行序列化和反序列化的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • c#中token的使用方法实例

    c#中token的使用方法实例

    本文主要介绍了c#中token的使用方法实例,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • dotnet如何将文件删除到回收站

    dotnet如何将文件删除到回收站

    这篇文章主要给大家介绍了关于dotnet如何将文件删除到回收站的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用dotnet具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-03-03
  • WPF模拟实现Gitee泡泡菜单的示例代码

    WPF模拟实现Gitee泡泡菜单的示例代码

    这篇文章主要介绍了如何利用WPF模拟实现Gitee泡泡菜单,文中的示例代码讲解详细,对我们学习或工作有一定帮助,需要的可以参考一下
    2022-08-08
  • C#中可空类型的使用

    C#中可空类型的使用

    本文主要介绍了C#中可空类型的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • C#通过接口与线程通信(捕获线程状态)示例代码

    C#通过接口与线程通信(捕获线程状态)示例代码

    本文介绍C#通过接口与线程通信(捕获线程状态),并提供简单的示例代码供参考
    2013-12-12
  • C#?PictureBox控件方法参数及图片删除重命名上传详解

    C#?PictureBox控件方法参数及图片删除重命名上传详解

    这篇文章主要为大家介绍了C#?PictureBox控件方法参数及图片删除重命名上传示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • C#中TCP粘包问题的解决方法

    C#中TCP粘包问题的解决方法

    这篇文章主要为大家详细介绍了C#中TCP粘包问题的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-07-07
  • c#防止多次运行代码收集分享

    c#防止多次运行代码收集分享

    原文:经过我的测试,还比较好用,但是有个问题,如果不注销,用另一个用户进入,则程序不能判断出已运行。所以只限于用在单用户环境,还是不太完美
    2013-09-09

最新评论

?


http://www.vxiaotou.com