通過(guò)App.xaml理解wpf中的Application類(lèi)
這個(gè)章節(jié)來(lái)了解Application類(lèi),我考慮了一晚上決定跳過(guò)控件類(lèi)相關(guān)的學(xué)習(xí),因?yàn)榭丶绻皇侨腴T(mén)的話每個(gè)控件F12跳過(guò)去看一下屬性、事件就能大致了解的差不多,而且控件比較多,每個(gè)都這樣看一遍,感覺(jué)意義不大。同時(shí)控件的使用一般又同時(shí)包含了,資源、樣式、觸發(fā)器、模板、綁定、列表控件的話,可能還包含列表虛擬化和數(shù)據(jù)虛擬化。所以想了一下。打算先講Application類(lèi)。
教程的第一篇我們從hello world開(kāi)始了解什么是程序。它是如何編譯、生成和運(yùn)行的?,F(xiàn)在這一個(gè)篇從App.xaml講解Application類(lèi)中能包含哪些東西,。這個(gè)Application類(lèi)有哪些應(yīng)用場(chǎng)景。
App.xaml 里包含什么
我們新創(chuàng)建一個(gè)WPF的程序,默認(rèn)什么代碼也不改動(dòng)的情況下雙擊程序代碼中的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)首先我們看程序啟動(dòng)后的第一步。通過(guò)OnStartUp()方法做啟動(dòng)參數(shù)檢查。
我們通過(guò)OnStartUp()方法的重寫(xiě)來(lái)區(qū)分不同啟動(dòng)參數(shù),可以讓程序干很多不同的事情,我們打開(kāi)任務(wù)管理器=》Name列右鍵點(diǎn)擊=》勾選顯示Command line,位置如下:
這樣我們就可以看到當(dāng)前很多其他程序,都是由啟動(dòng)參數(shù)的,啟動(dòng)參數(shù)按空格分割,有的程序會(huì)有一組參數(shù),所以對(duì)我們來(lái)說(shuō),啟動(dòng)參數(shù)同樣也是很重要的東西。不管是單例,還是讓程序啟動(dòng)不同的功能,啟動(dòng)參數(shù)就是軟件功能解耦的第一步。
我們找到上上個(gè)截圖的OnStartup方法,我們?cè)贏pp.xaml.cs里重寫(xiě)他,代碼如下,并在解決方案下的程序集右鍵=》屬性=》左側(cè)列表選擇調(diào)試=》命令行參數(shù)這里添加對(duì)應(yīng)的調(diào)試參數(shù),我們這里設(shè)置用空格分割一句話,這樣我們就可以調(diào)試了,F(xiàn)5啟動(dòng)。
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()}"); } } }
我們看到了參數(shù)是4行,內(nèi)容是-hello duwenong Mastery C#。這樣我們通過(guò)重寫(xiě)OnStartup就可以實(shí)現(xiàn)參數(shù)對(duì)不同的參數(shù)做不同的處理。
2)用戶注銷(xiāo),但是程序正在處理關(guān)鍵任務(wù),通過(guò)重寫(xiě)OnSessionEnding()來(lái)提示當(dāng)前工作尚未結(jié)束。
我們通過(guò)重寫(xiě)OnSessionEnding()可以在重要工作沒(méi)做完但是,用戶選擇關(guān)機(jī)、重啟或注銷(xiāo)電腦時(shí)提示用戶我們有任務(wù)尚未結(jié)束。
private bool _unsavedData = false; public bool UnsavedData { get { return _unsavedData; } set { _unsavedData = value; } } protected override void OnSessionEnding(SessionEndingCancelEventArgs e) { base.OnSessionEnding(e); //假設(shè)某些線程未完成保存,把UnsaveData設(shè)置為T(mén)rue UnsavedData = true; if (UnsavedData) { e.Cancel = true; MessageBox.Show($"我們的數(shù)據(jù)尚未保存完畢,{e.ReasonSessionEnding} 將丟失數(shù)據(jù)。"); } }
3)默認(rèn)啟動(dòng)那個(gè)Window窗體。我們使用StartupUri設(shè)置可以修改默認(rèn)啟動(dòng)的Window窗體。
這樣啟動(dòng)的就是我們新創(chuàng)建的Window1.
4)通過(guò)ShutdownMode修改程序默認(rèn)的關(guān)閉方式。
1.OnExplicitShutdown 這個(gè)方法比較特殊,他是除非通過(guò)代碼調(diào)用了Application.Shutdown()方法,否則即使所有窗口都關(guān)閉了,程序仍然駐留再后臺(tái)。
2.OnLastWindowClose 這個(gè)是默認(rèn)的值,只要至少有一個(gè)窗口存在,應(yīng)用程序就保持運(yùn)行狀態(tài),但是注意如果關(guān)閉了主窗口,MainWindow扔就指向當(dāng)時(shí)的窗體,需要代碼切換MainWindow到其他窗體
3.OnMainWindowClose 這個(gè)是只要主窗體還處于打開(kāi)狀態(tài),應(yīng)用程序就保持運(yùn)行,如果主窗體關(guān)閉進(jìn)程就退出。
5)使用Application.Current訪問(wèn)當(dāng)前Application的實(shí)例
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; } }
我們使用代碼獲取當(dāng)前打開(kāi)的所有window的標(biāo)題。
Application的屬性和方法目前就寫(xiě)這么多,其他的大家可以自己F12看一下并嘗試寫(xiě)一下代碼,資源和資源的查找雖然也是Application下的。但是我覺(jué)得這點(diǎn)要要出來(lái)單獨(dú)講,所以就不寫(xiě)在這里啦。
以上就是通過(guò)App.xaml理解wpf中的Application類(lèi)的詳細(xì)內(nèi)容,更多關(guān)于理解wpf中的Application類(lèi)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- C# WPF實(shí)現(xiàn)的語(yǔ)音播放自定義控件
- c# wpf如何更好的使用Application程序集資源
- 詳解WPF的InkCanvas選擇模式
- 詳解WPF中的隧道路由和冒泡路由事件
- C# WPF如何反射加載Geometry幾何圖形數(shù)據(jù)圖標(biāo)
- c# wpf如何附加依賴(lài)項(xiàng)屬性
- c# WPF中的TreeView使用詳解
- c# wpf如何使用Blend工具繪制Control樣式
- c# 基于GMap.NET實(shí)現(xiàn)電子圍欄功能(WPF版)
- c# wpf使用GMap.NET類(lèi)庫(kù),實(shí)現(xiàn)地圖軌跡回放
- 詳解WPF中的對(duì)象資源
相關(guān)文章
C#科學(xué)繪圖之使用scottPlot繪制多個(gè)圖像
ScottPlot是基于.Net的一款開(kāi)源免費(fèi)的交互式可視化庫(kù),支持Winform和WPF等UI框架,本文主要為大家詳細(xì)介紹了如何使用scottPlot實(shí)現(xiàn)繪制多個(gè)圖像,需要的可以參考下2023-12-12c#實(shí)現(xiàn)多線程局域網(wǎng)聊天系統(tǒng)
這篇文章主要介紹了c#實(shí)現(xiàn)多線程局域網(wǎng)聊天系統(tǒng)的相關(guān)代碼,有此方面需求的小伙伴可以參考下。2015-06-06C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法
這篇文章主要介紹了C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法
這篇文章主要介紹了C#實(shí)現(xiàn)把dgv里的數(shù)據(jù)完整的復(fù)制到一張內(nèi)存表的方法,需要的朋友可以參考下2014-08-08unity3d?對(duì)接?workerman?實(shí)現(xiàn)聯(lián)機(jī)游戲功能
workerman?是一款開(kāi)源高性能?PHP?應(yīng)用容器,他除了用于互聯(lián)網(wǎng)、即時(shí)通訊、APP?開(kāi)發(fā)、硬件通訊、智能家居、物聯(lián)網(wǎng)等領(lǐng)域的開(kāi)發(fā)外,這篇文章主要介紹了unity3d?對(duì)接?workerman?實(shí)現(xiàn)聯(lián)機(jī)游戲,需要的朋友可以參考下2022-10-10C#封裝的Sqlite訪問(wèn)類(lèi)實(shí)例
這篇文章主要介紹了C#封裝的Sqlite訪問(wèn)類(lèi),實(shí)例分析了C#針對(duì)Sqlite數(shù)據(jù)庫(kù)各種常用操作的相關(guān)技巧,需要的朋友可以參考下2015-04-04