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
WPF教程七:通过App.xaml来了解Application类都能干什么的更多相关文章
- WPF入门之一APP.XAML
WPF运行之后,App.xaml是应用的声明起始点. 一.指定入口 通过指定Application 的StartupUri属性,指示了启动应用的时候,加载哪个窗口或网页. 最常见的就是将默认的Main ...
- WPF App.xaml.cs常用模板,包括:异常捕获,App只能启动一次
App.xaml.cs中的代码每次都差不多,故特地将其整理出来直接复用: using System; using System.Configuration; using System.Diagnost ...
- 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1
原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator-更新至Prism7.1 事件聚合器EventAggregator [7.1updated]除了app部分,没 ...
- 从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator?
原文:从PRISM开始学WPF(七)MVVM(三)事件聚合器EventAggregator? 从PRISM开始学WPF(一)WPF? 从PRISM开始学WPF(二)Prism? 从PRISM开始学WP ...
- WPF教程九:理解WPF中的对象资源
在WPF中,所有继承自FrameworkElement的元素都包含一个Resources属性,这个属性就是我们这篇要讲的资源. 这一篇讲解的资源是不是上一篇的程序集资源(那个是在编译过程中打包到程序集 ...
- Laravel教程 七:表单验证 Validation
Laravel教程 七:表单验证 Validation 此文章为原创文章,未经同意,禁止转载. Laravel Form 终于要更新这个Laravel系列教程的第七篇了,期间去写了一点其他的东西. 就 ...
- ASP.NET 5系列教程(七)完结篇-解读代码
在本文中,我们将一起查看TodoController 类代码. [Route] 属性定义了Controller的URL 模板: [Route("api/[controller]") ...
- WPF学习01:初始XAML浅析
本文内容: 浅析WPF应用默认创建的XAML中元素.attributes. 新建WPF工程“HelloWPF”. 初始创建的主窗体XAML代码如下: <Window x:Class=" ...
- Unity3D嵌入WPF教程
Unity3D嵌入WPF教程 创建一个 类库工程 添加 WindowForm 用户控件 (UserControl) 1).引入 UntiyWebPlayer COM 组件 在工具->选择工具箱中 ...
随机推荐
- volatile 关键字笔记
你应该知道的 volatile 关键字 当一个变量被 volatile 修饰时,任何线程对它的写操作都会立即刷新到主内存中,并且会强制让缓存了该变量的线程中的数据清空,必须从主内存重新读取最新数据. ...
- 一枚通过参数污染绕过百度RASP的XSS
日常工作过程中,偶然发现一个网站登录页面,在页面返回包中存在一个隐藏参数"mess",且该页面部署了百度RASP进行防护,本文介绍如何发现隐藏参数以及如何通过参数污染方式造成XSS ...
- springboot——发送put、delete请求
在springmvc中我们要发送put和delete请求,需要先配置一个过滤器HiddenHttpMethodFilter,而springboot中,已经帮我们自动配置了,所以我们可以不用配置这个过滤 ...
- ThreadLocal源码阅读笔记
功能描述 ThreadLocal解决了访问共享变量的阻塞问题,并且不需要像CAS操作一样牺牲CPU资源,它为每一个线程维护了一个变量副本,每个线程在访问ThrealLocal里面的变量时实际上访问的是 ...
- python pyyaml操作yaml配置文件
在测试工作中,可以使用yaml编写测试用例,执行测试用例时直接获取yaml中的用例数据进行测试(如:接口自动化测试) 1.什么是yaml 是一种可读的数据序列化语言,通常用于配置文件 非常简洁和强大, ...
- 并发王者课-铂金2:豁然开朗-“晦涩难懂”的ReadWriteLock竟如此妙不可言
欢迎来到<并发王者课>,本文是该系列文章中的第15篇. 在上篇文章中,我们介绍了Java中锁的基础Lock接口.在本文中,我们将介绍Java中锁的另外一个重要的基本型接口,即ReadWri ...
- Maven笔记(更新中)
Maven 1.学习目标 会使用maven构建项目的命令 会使用maven构建java项目和java web项目 依赖管理--传递依赖 版本冲突处理 在web的单个工程中实现jsp+servlet整合 ...
- Integer 如何实现节约内存和提升性能的?
在Java5中,为Integer的操作引入了一个新的特性,用来节省内存和提高性能.整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用. 上面的规则默认适用于整数区间 -128 到 +127(这 ...
- Git 高级用法,喜欢就拿去用
如果你觉得 git 很迷惑人,那么这份小抄正是为你准备的! 请注意我有意跳过了 git commit.git pull/push 之类的基本命令,这份小抄的主题是 git 的一些「高级」用法. 导航 ...
- 【题解】codeforces 467C George and Job dp
题目描述 新款手机 iTone6 近期上市,George 很想买一只.不幸地,George 没有足够的钱,所以 George 打算当一名程序猿去打工.现在George遇到了一个问题. 给出一组有 n ...