原文: 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()
{
//方法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();
}
}
View Code
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);
}
}