C# WPF编程-Application类(生命周期、程序集资源、本地化)

C# WPF编程-Application类

  • 应用程序的生命周期
    • 创建Application对象
    • 应用程序的关闭方式
    • 应用程序事件
  • Application类的任务
    • 显示初始界面
    • 处理命令行参数
    • 访问当前Application对象
    • 在窗口之间进行交互
  • 程序集资源
    • 添加资源
    • 检索资源
    • pack URI
    • 内容文件
  • 本地化
    • 构建能够本地化的用户界面

每个运行中的WPF应用程序都由System.Windows.Application类的一个实例来表示。该类跟踪在应用程序中打开的所有窗口,决定何时关闭应用程序。

应用程序的生命周期

在WPF中,应用程序会经历简单的生命周期。本质上,Visual Studio为Application类使用的模型与用于窗口的模型相同。起点是XAML模板,默认情况下该模板命名为App.xaml:

创建Application对象

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

StartupUri属性来确定主窗口的XAML文档。因此不需要代码显式地实例化窗口,XAML解析器自动完成这项工作。自动生成的部分在项目中是不可见的,看起来如下:

using System;
using System.Windows;
public partial class App:Application
{
	[STAThread()]
	public static void Main()
	{
		WpfApp3.App app = new WpfApp3.App();
		app.InitializeComponent();
		app.Run();
	}
	
	public void InitializeComponent()
	{
		this.StartupUri = new Uri("Window1.xaml", System.UriKind.Relative);
	}
	
}

应用程序的关闭方式

通常,只要有窗口未关闭,Application类就保持应用程序处于有效状态。
可通过Appliaction.ShutdownMode属性修改关闭模式,枚举值:

  • OnLastWindowClose:默认行为,只少有一个窗口存在,应用程序就保持运行状态。
  • OnMainWindowClose:传统方式,只要主窗口还处于打开状态,应用程序就保持运行状态。
  • OnExplictitShutdown:除非调用Application.Shutdown()方法,否则应用程序不会结束。

App.xaml文件中添加ShutdownMode=“OnMainWindowClose”

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

应用程序事件

App.xaml.cs文件里可添加代码来处理应用程序事件。
应用程序事件:

  • Startup:该事件在调用Application.Run()方法之后,并且在主窗口显示之前。
  • Exit:该事件在应用程序关闭时,并在Run()方法即将返回之前发生。
  • SessionEnding:该事件在Window对话结束时发生。
  • Activated:当激活应用程序中的窗口是发生该事件。
  • Deactivated:当取消激活用用程序中的窗口时发生该事件。
  • DispatcherUnhandledException:在应用程序中的任何位置,只要发送未处理的异常,就会发生该事件。

处理事件两种方法:

  • 关联事件处理程序;
  • 重写相应的受保护方法。

关联事件处理程序,如xmal中添加事件处理DispatcherUnhandledException=“Application_DispatcherUnhandledException”
App.xaml

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

App.xaml.cs:

private void Application_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e)
{

}

代码重写事件方法窗口事件:

using System.Configuration;
using System.Data;
using System.Windows;

namespace WpfApp3
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {

        private bool unsaveDate = false;

        public bool UnsaveDate 
        {
            get { return unsaveDate; }
            set { unsaveDate = value; }
        }

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            UnsaveDate = true;
        }

        protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
        {
            base.OnSessionEnding(e);

            if (UnsaveDate)
            { 
                e.Cancel = true;
                MessageBox.Show("测试:"+e.ReasonSessionEnding.ToString());
            }
        }        
    }
}

Application类的任务

显示初始界面

WPF应用程序的运行速度快,但并不能在瞬间启动。第一次启动应用程序时,会有一些延迟,因为公共语言运行时(Common Language Runtime,CLR)首先需要初始化.NET环境,然后启动应用程序。通常这一延时时间很短。但如果具有更耗时的初始化步骤,可使用WPF提供的简单初始界面特性,添加加初始界面的方法:

  • 为项目添加图像文件(.bmp,.png,.jpg文件)。
  • 在Solution Explorer中选择图像文件。
  • 将Build Action修改为SplashScreen。
    下次运行应用程序时,图像会立即在屏幕中央显示出来。当添加初始界面时,WPF编译器为自动生成的App.cs文件添加与下面类似的代码:
SplashScreen splashScreen = new SplashScreen("splashScreenImage.png");
splashScreen.show(true);
MyApplication.App app = new MyApplication.App();
app.InitializeComponent();
app.Run();

处理命令行参数

为处理命令行参数,需要响应Application.Startup事件。命令行参数是通过StartupEventArgs.Args属性作为字符串数组提供的。
例如,假定希望加载文档,文档名作为命令行参数传递。通过代码实例化主窗口。

public partial class App : Application
{
	private static void App_Startup(object sender, StartupEventArgs e)
	{
		FileViewer win = new FileViewer();
		if (e.Args.Length > 0)
		{
			string file = e.Args[0];
			if (System.IO.File.Exists(file))
			{
				win.LoadFile(file);
			}
			else
			{
				
			}
		}
	}
}

访问当前Application对象

通过静态的Application.Current属性,可在应用程序的任何位置获取当前应用程序的实例,从而在窗口之间进行基本交互,任何窗口都可以访问当前Application对象,并通过Application对象获取主窗口的引用:
Window main = Application.Current.MainWindow;
MessageBox.Show("The main window is " + main.Title);

如果希望访问在自定义窗口类中添加的任意方法、属性或事件,需要将窗口对象转装换为正确类型。
MainWindow main = (MainWindow)Application.Current.MainWindow;
main.DoSomething();

在窗口中还可以检查Application.Windows集合的内容:
foreach( Window window in Application.Current.Windows)
{
MessageBox.Show(window.Title + " is open.");
}

在窗口之间进行交互

应用程序类还可以很好地达到另一个目的:保存重要窗口的引用,使一个窗口可访问另一个窗口。

窗口分为模态和非模态:

  • 模态窗口:模态窗口会中断应用程序流,直到窗口关闭为止。
  • 非模态窗口:非模态窗口则不中断应用程序流。

示例,每个文档窗口由名为Document的类实例表示:

public partial class App : Application
{
	private List<Document> documents = new List<Document>();
	public List<Document> Documents
	{
		get {return documents};
		set {documents = value;}
	}
}

下面是响应按钮点击事件的处理程序:

private void cmdCreate_Click(object sender, RouteEventArgs e)
{
	Document doc = new Document();
	doc.Owner = this;
	doc.Show();
	((App)Application.Current).Documents.Add(doc);
}

程序集资源

WPF应用程序中的程序集资源与其他.NET应用程序中的程序集资源在本质上是相同的。基本概念是为项目添加文件,从二Visual Studio可将其嵌入到编译过的应用程序的EXE或DLL文件中。

添加资源

通过向项目添加文件,并在Properties窗口中将其Build Action属性设置为Resource来添加资源。
在这里插入图片描述
为成功地使用程序集资源,未必注意一下两点:

  • 不能将Build Action属性错误地设置为Embedded Resource。
  • 不要在Project Properties窗口中使用Resource选项卡。

检索资源

可以采用多种方法来使用资源。
低级方法是检索封装数据的StreamResourceInfo对象,然后决定如何使用该对象。
StreamResourceInfo sri = Application.GetResourceStream(new Uri(“images/winter.jpg”, UriKind.Relative));

XMAL:
<\Image Source=“Images/1.jpg”></Image>

使用BitmapImage对象,该对象使用URI确定希望显示的图像位置。
绝对路径:
img.Source = new BitmapImage(new Uri((@“d:\Img\jpgs\2.jpg”));

相对路径:
img.Source = new BitmapImage(new Uri(“images/6.jpg”, UriKind.Relative));

pack URI

WPF使用pack URI语法寻址编译个的资源。使用相对URI来引用资源
images/2.jpg

内容文件

当嵌入式文件作为资源时,会将文件放到编译过的程序集中,并且可以确保文件总是可用的。
如下情况不适合使用这种方法:

  • 希望改变资源文件,有不想重新编译应用程序;
  • 资源文件非常大;
  • 资源文件是可选的,并且可以不随程序集一起部署;
  • 资源是声音文件(WPF声音类不支持程序集资源);

WPF为程序集添加了AssemblyAssociatedContentFile特性,声明每个内容文件的存在。
为项目添加音频文件:

  • 在Solution Explorer中选择该文件,并在Properties中将Build Action属性改为Content。
    <\MediaElement Name=“Sound” Source=“Sounds/1.wav” LoadeBehavior=“Manual”></MediaElement>

本地化

构建能够本地化的用户界面

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/508425.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

vue改名为威优易?

文章目录 vue改名为威优易&#xff1f; 祝大家愚人节快乐哇&#xff01; 哈哈&#xff0c;大家愚人节快乐&#xff01;看来我刚刚的“爆料”确实把大家吓了一跳&#xff0c;Vue.js要改名为“威优易”&#xff1f;这纯粹是官方在这个愚人节使者开的一个小小玩笑啦&#xff01; …

R语言技能 | 不同数据类型的转换

原文链接&#xff1a;R语言技能 | 不同数据类型的转换 本期教程 写在前面 今天是4月份的第一天&#xff0c;再过2天后再一次迎来清明小假期。木鸡大家是否正常放假呢&#xff1f; 我们在使用R语言做数据分析时&#xff0c;会一直对数据进行不同类型的转换&#xff0c;有时候…

VSCode - 离线安装扩展python插件教程

1&#xff0c;下载插件 &#xff08;1&#xff09;首先使用浏览器打开 VSCode 插件市场link &#xff08;2&#xff09;进入插件主页&#xff0c;点击右侧的 Download Extension 链接&#xff0c;将离线安装包下载下来&#xff08;文件后缀为 .vsix&#xff09; 2&#xff0c;…

Windows基线安全检测-安全配置检测

Windows基线安全检测-安全配置检测 前言 Windows在生产环境中是使用最多的一个系统&#xff0c;大部分为客户端&#xff0c;少部分为服务端&#xff1b; 然而其实很多用户对windows系统不是很了解&#xff0c;安全配置更是如此&#xff1b; 因此我们安全人员要定期对员工的主…

心里健康(健康与生存)

你还认为 健康 是有个强壮的身体吗&#xff1f; 这样 肯定是错的 我们来说说 什么是健康与现代健康观 以及影响健康的因素 有哪些&#xff1f; 以及 健康对个人与社会的意义 首先 我们来看看 健康演变过程 公元 1000 年 Health 首次出现 它代表了 强壮 健全 完整等含义 健康 …

Qt中出现中文乱码的原因以及解决方法

Qt专栏&#xff1a;http://t.csdnimg.cn/C2SDN 目录 1.引言 2.原因分析 3.源文件的编码格式修改方法 4.程序内部使用的默认编码格式修改方法 5.QString转std::string的方法 6.总结 1.引言 在编写Qt程序的时候&#xff0c;或多或少都可能遇到用QString时候&#xff0c;明明…

【QT+QGIS跨平台编译】056:【pdal-dimbuilder+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal介绍二、dimbuilder介绍三、pdal下载四、文件分析五、pro文件六、编译实践七、生成Dimension.hpp八、生成pdal_features.hpp一、pdal介绍 PDAL(Point Data Abstraction Library)是一个开源库,用于处理点云数据的获取、过滤、转换、分析和…

iPhone设备中如何导出和分享应用程序崩溃日志的实用方法

​ 目录 如何在iPhone设备中查看崩溃日志 摘要 引言 导致iPhone设备崩溃的主要原因是什么&#xff1f; 使用克魔助手查看iPhone设备中的崩溃日志 奔溃日志分析 总结 摘要 本文介绍了如何在iPhone设备中查看崩溃日志&#xff0c;以便调查崩溃的原因。我们将展示三种不同的…

如何提高图片的分辨率?dpi修改工具推荐

在调整分辨率之前&#xff0c;我们需要了解什么是dpi分辨率&#xff0c;简单来说&#xff0c;分辨率是指图像中包含的像素数量&#xff0c;分辨率越高&#xff0c;图像就越清晰&#xff0c;常见的分辨率包括72dpi、96dpi和300dpi等&#xff0c;在打印照片或者一些考试平台对图片…

Django之REST framework环境搭建

一、环境搭建 Django REST framework是基于Django实现的一个RESTful风格API框架,能够帮助我们快速开发RESTful风格的API 官网:Home - Django REST framework 中文文档:主页 - Django REST framework中文站点 1.1、安装 Python3.8+ pip install django==4.1.1 pip inst…

Samtec连接器 | 应用分享C-V2X技术在汽车领域的应用

【前言】 在汽车设计领域有一个新的缩写&#xff0c;就是C-V2X。被谈及时&#xff0c;这被称为车辆到X&#xff0c;有时也被称为车辆到万物。前面的 "C "代表蜂窝网络。 这些缩写代表最新的基于车辆应用利用蜂窝通讯网络的电子产品。特别是&#xff0c;正在推出的5G…

标定系列——预备知识-OpenCV中矫正相关函数(十二)

标定系列——预备知识-OpenCV中矫正相关函数&#xff08;十二&#xff09; 说明记录 说明 记录了OpenCV中的矫正相关函数的使用 记录

苹果应用上架攻略

苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。以下是苹果上架要求的详细介绍&#xff1a;1. 应用程序的内容和功能必须符合苹果公司的规 苹果上架要求是苹果公司对于提交应用程序到苹果商店上…

VScode 集成终端设置默认打开当前文件夹 mac系统

一.快捷键设置 搜索 openInIntegratedTerminal 如图&#xff1a; 二.设置cmd 默认打开位置 点击设置 搜索 ntegrated:cwd 如下图&#xff1a; 三.查看ip 快捷指令&#xff1a; ipconfig getifaddr en0

【讲解下NLP学习路线的总结】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

2024年网络安全运营体系建设方案

以下是部分WORD内容&#xff0c;请您参阅。如需下载完整WORD文件&#xff0c;请前往星球获取&#xff1a; 网络安全运营监控工作整体构想 工作目标及原则 工作目标 为进一步落实强化公司网络安全保障&#xff0c;有效支撑公司数字化转型战略&#xff0c;建立健全公司网省两级协…

[ruby on rails] ruby使用vscode做开发

ruby LSP实现 ruby插件推荐用这个来实现&#xff0c;但是现在这个在加载文件索引时候&#xff0c;特别慢&#xff0c;时好时坏&#xff0c;所以现在推荐用Solargraph实现 ruby LSP要求ruby版本3以上&#xff0c;如果在旧版本中使用&#xff0c;需要指定bundleGemfile路径 旧版…

设计模式之享元模式详解(上)

享元模式 1&#xff09;概述 1.问题 如何避免系统中出现大量相同或相似的对象&#xff0c;同时又不影响客户端程序通过面向对象的方式对这些对象进行操作。 2.解决方案 在逻辑上每一个出现的字符都有一个对象与之对应&#xff0c;然而在物理上它们却共享同一个享元对象&am…

LabVIEW动车组谐波分析与检测系统

LabVIEW动车组谐波分析与检测系统 随着中国高速铁路网络的快速发展&#xff0c;动车组数量和运行速度的不断提升&#xff0c;其产生的谐波问题对电网产生了不小的影响。基于图形化编程语言LabVIEW&#xff0c;开发了一套动车组谐波分析与检测系统&#xff0c;旨在实时监控与分…

《2023腾讯云容器和函数计算技术实践精选集》--在 K8s 上跑腾讯云 Serverless 函数,打破传统方式造就新变革

目录 目录 前言 《2023腾讯云容器和函数计算技术实践精选集》带来的思考 1、特色亮点 2、阅读体验 3、实用建议 4、整体评价 Serverless 和 K8s 的优势 1、关于Serverless 函数的特点 2、K8s 的特点 腾讯云 Serverless 函数在 K8s 上的应用对企业服务的影响 案例分…