1. 程式人生 > >WPF中的Application類。

WPF中的Application類。

顯示 背景圖片 之前 border cee spa gif from clas

原文: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);
    }
}

WPF中的Application類。