WPF中的Application類。
Application對象用的名稱空間是system.windows
1、手動創建Application對象步驟。
1.1)、把項目中的App.Xaml文件從項目中排除。
1.2)、新建Startup類。
1.3)、在類中聲明靜態的、無返回值的Main方法。
1.4)、在方法中創建application對象和窗口對象。
public class Startup { [STAThread] //指定應用程序的 COM 線程模式是單線程單元(STA) static void Main() {View Code//方法1: //創建Application對象。 Application app = new Application(); //實例化窗口。 MainWindow mw = new MainWindow(); //當向Application.Run()方法傳遞一個窗口時,該窗口被設置為主窗口,可通過Application.MainWindow屬性在整個應用程序中訪問這個窗口。然後使用Run()方法觸發Application.Startup事件顯示主窗口。 app.Run(mw);//方法2: //創建Application對象。 Application app = new Application(); //實例化窗口。 MainWindow mw = new MainWindow(); //設置應用程序主窗口。 app.MainWindow = mw; //彈出窗口 mw.Show(); //當向Application.Run()方法傳遞一個窗口時,該窗口被設置為主窗口,可通過Application.MainWindow屬性在整個應用程序中訪問這個窗口。然後使用Run()方法觸發Application.Startup事件顯示主窗口。app.Run(); //方法3 //創建application對象。 Application app = new Application(); //設置uri。 app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative); app.Run(); } }
2、設置應用程序關閉方式。
通常只要窗口尚未關閉,Application類就保持應用程序處於有效狀態,如果這不是期望的行為,可調整Application.ShutdownMode屬性。如果手動創建Application對象就需要在調用Run()方法之前設置ShutDownMode屬性。如果使用的是App.Xaml文件,那麽可在xaml文件中單獨設置ShutdownMode屬性。 當執行Application.Run()方法的時候會導致Application.Run()方法立即返回。
ShutdownMode枚舉值 |
|
名稱 |
說明 |
OnLastWindowClose |
默認行為,只要至少還有一個窗口存在,應用程序就會保持運行狀態。 |
OnMainWindowClose |
傳統方式,只要主窗口還處於打開狀態,應用程序就會保持運行狀態。 |
OnExceptionShutdown |
除非調用Application.Shutdown()方法,否則應用程序就不會結束(即使所有程序都已經關閉)。 |
3、常用的應用程序事件。
名稱 |
說明 |
Startup |
該事件在調用Application.Run()方法之後,並且在主窗口顯示之前執行。 |
Exit |
該事件在應用程序關閉時(不管什麽原因),並在Run方法即將返回之前發生,要放在Run()方法之前 |
SessionEnding |
該事件在Windows對話結束時發生 |
Activated |
當激活應用程序中的窗口時發生該事件,當切換到另外一個window程序時也會觸發。 |
Deactivated |
當取消激活應用程序中的窗口時發生該事件,當切換到另外一個window程序時也會觸發。 |
DispatcherUnhandledException |
應用程序只要發生未處理的異常,都會進入該事件。還可將Handled屬性設置為true,繼續運行應用程序。 |
4、顯示初始界面。
WPF應用程序的速度快,但並不能在瞬間啟動,第一次啟動應用程序的時候,會有一些延遲,因為公共語言運行時,首先要初始化 .Net環境,然後啟動應用程序,這個時候顯示初始界面就有作用了。在Run方法之前執行以下代碼。
//屏幕初始化的時候的背景圖片。
SplashScreen splashScreen = new SplashScreen("1.png");
//顯示初始屏幕。
splashScreen.Show(true);
//淡出初始界面時間(單位是秒)。
splashScreen.Close(TimeSpan.FromSeconds(1));
5、訪問當前Application對象。
通過Application.Current.MainWindow屬性可在應用程序的任何位置獲取當前應用程序實例。從而在多個窗口之間進行基本交互。
假設MainWindow(主窗口)中有一個Test()方法,那麽在Window1窗口中可通過以下方式進行訪問:
//獲取主窗口對象。
MainWindowainWindow mw = (MainWindow)Application.Current.MainWindow;
//調用主窗口Test()方法。
mw.Test();
6、窗口之間進行交互步驟。
6.1)、刪除App.xaml文件。
6.2)、新建一個App的類且繼承自Application,在裏面設置窗口啟動項,在寫一個Window類型的集合。
6.3)、在主窗口實例化子窗口時,為子窗口設置Ower屬性等於主窗口。
6.4)、在子窗口中通過Application.Current.MainWindow屬性得到主窗口對象,並調用方法。
6.5)、在主窗口中循環遍歷集合中的數據進行設置子窗口。
App類:
public class App : Application
{
[STAThread]
public static void Main()
{
//實例化類。
App app = new App();
app.InitializeComponent();
app.Run();
}
private void InitializeComponent()
{
//設置主窗口啟動項。
this.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
}
//聲明一個Window類型的集合,用於放置子窗口。
private List<Window> listWindow = new List<Window>();
public List<Window> ListWindow
{
get { return listWindow; }
set { this.listWindow = value; }
}
}
MainWinow後臺代碼:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.Loaded += MainWindow_Loaded;
}
void MainWindow_Loaded(object sender, RoutedEventArgs e)
{
//窗口加載的時候把Winow1窗口彈出來。
Window1 w1 = new Window1();
//為Window1Owner屬性。
w1.Owner = this;
//顯示出來。
w1.Show();
//將Winow1加入到集合中。
((App)App.Current).ListWindow.Add(w1);
}
/// <summary>
/// 此方法用於將主窗口標題設置為當前時間。
/// </summary>
public void SetMainWinowTime()
{
this.Title = DateTime.Now.ToString();
}
/// <summary>
/// 此方法用於設置子窗口標題為當前時間。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click(object sender, RoutedEventArgs e)
{
for (int i = 0; i < ((App)App.Current).ListWindow.Count; i++)
{
//將集合中的向轉換為Window1對象,然後調用SetWindowTime()方法。
((Window1)((App)App.Current).ListWindow[i]).SetWindowTime();
}
}
}
Window窗口後臺代碼:
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
/// <summary>
/// 此方法用於設置子窗口標題為當前時間。
/// </summary>
public void SetWindowTime()
{
this.Title = DateTime.Now.ToString();
}
/// <summary>
/// 此方法用於獲取主窗口,然後調用SetMainWinowTime()方法。
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void Button_Click(object sender, RoutedEventArgs e)
{
((MainWindow)Application.Current.MainWindow).SetMainWinowTime();
}
}
效果圖:
7、單實例應用程序。
實現步驟:
7.1)、刪除App.xaml文件。
7.2)、引用Microsoft.VisualBasic程序集。
7.3)、創建SignelInstanceApplication類,讓其繼承自Application類,在類中重寫OnStartup方法(用於實例化窗口),創建Activate()方法(用於激活當前窗口)。
7.4)、創建SignelApplicationManager類,此類繼承自WindowsFormsApplicationBase類,此類中包含了3個重要的成員。
7.5)、寫一個Startup類,在裏面寫Main方法,實例化SignelApplicationManager類。
SignelInstanceApplication類:
public class SignelInstanceApplication : System.Windows.Application
{
/// <summary>
/// 重寫OnStartup()方法,在方法中實例化主窗口。
/// </summary>
/// <param name="e"></param>
protected override void OnStartup(System.Windows.StartupEventArgs e)
{
base.OnStartup(e);
//在OnStartup()方法中實例化窗口對象(在這裏是主窗口)。
MainWindow mw = new MainWindow();
mw.Show();
}
/// <summary>
/// 此方法用於激活當前窗口(讓窗口顯示最前端)。
/// </summary>
public void Activate()
{
System.Windows.MessageBox.Show("此程序已運行"); //再做其他的處理。
this.MainWindow.Show();
this.MainWindow.Activate();
}
}
SignelApplicationManager類:
class SignelApplicationManager : WindowsFormsApplicationBase
{
//聲明application對象。
SignelInstanceApplication app;
/// <summary>
/// 在構造函數中設置IsSingleInstance為單例模式。
/// </summary>
public SignelApplicationManager()
{
//IsSingleInstance:確定此應用程序是否為單例應用程序。
this.IsSingleInstance = true;
}
/// <summary>
/// 在OnStartup方法中實例化SignelInstanceApplication對象。
/// </summary>
/// <param name="eventArgs"></param>
/// <returns></returns>
protected override bool OnStartup(StartupEventArgs eventArgs)
{
base.OnStartup(eventArgs);
//實例化SignelInstanceApplication對象。
app = new SignelInstanceApplication();
app.Run();
//返回false。
return false;
}
/// <summary>
/// 在OnStartupNextInstance調用激活函數。
/// </summary>
/// <param name="eventArgs"></param>
protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
{
base.OnStartupNextInstance(eventArgs);
app.Activate();
}
}
Startup類:
public class Startup
{
[STAThread()]
public static void Main(string[] args)
{
//實例化SignelApplicationManager對象。
SignelApplicationManager sm = new SignelApplicationManager();
//調用Run()。
sm.Run(args);
}
}
WPF中的Application類。