天天看點

WPF中的Application類。

原文: WPF中的Application類。 Application對象用的名稱空間是system.windows

1、手動建立Application對象步驟。

1.1)、把項目中的App.Xaml檔案從項目中排除。

1.2)、建立Startup類。

1.3)、在類中聲明靜态的、無傳回值的Main方法。

1.4)、在方法中建立application對象和視窗對象。 

WPF中的Application類。
WPF中的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();
    }
}      

 效果圖:

WPF中的Application類。

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元素綁定
下一篇: WPF指令

繼續閱讀