1、Application对象

1.1)、把项目中的App.Xaml文件从项目中排除。
1.2)、新建Startup类。
1.3)、在类中声明静态的、无返回值的Main方法。
1.4)、在方法中创建application对象和窗口对象。

  1. public class Startup
  2. {
  3. [STAThread] //指定应用程序的 COM 线程模式是单线程单元(STA)
  4. static void Main()
  5. {
  6. //方法1:
  7. //创建Application对象。
  8. Application app = new Application();
  9. //实例化窗口。
  10. MainWindow mw = new MainWindow();
  11. //当向Application.Run()方法传递一个窗口时,该窗口被设置为主窗口,可通过Application.MainWindow属性在整个应用程序中访问这个窗口。然后使用Run()方法触发Application.Startup事件显示主窗口。
  12. app.Run(mw);
  13. //方法2:
  14. //创建Application对象。
  15. Application app = new Application();
  16. //实例化窗口。
  17. MainWindow mw = new MainWindow();
  18. //设置应用程序主窗口。
  19. app.MainWindow = mw;
  20. //弹出窗口
  21. mw.Show();
  22. //当向Application.Run()方法传递一个窗口时,该窗口被设置为主窗口,可通过Application.MainWindow属性在整个应用程序中访问这个窗口。然后使用Run()方法触发Application.Startup事件显示主窗口。
  23. app.Run();
  24. //方法3
  25. //创建application对象。
  26. Application app = new Application();
  27. //设置uri。
  28. app.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
  29. app.Run();
  30. }
  31. }

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方法之前执行以下代码。

  1. //屏幕初始化的时候的背景图片。
  2. SplashScreen splashScreen = new SplashScreen("1.png");
  3. //显示初始屏幕。
  4. splashScreen.Show(true);
  5. //淡出初始界面时间(单位是秒)。
  6. splashScreen.Close(TimeSpan.FromSeconds(1));

5、访问当前Application对象。

通过Application.Current.MainWindow属性可在应用程序的任何位置获取当前应用程序实例。从而在多个窗口之间进行基本交互。
假设MainWindow(主窗口)中有一个Test()方法,那么在Window1窗口中可通过以下方式进行访问:

  1. //获取主窗口对象。
  2. MainWindowainWindow mw = (MainWindow)Application.Current.MainWindow;
  3. //调用主窗口Test()方法。
  4. mw.Test();

6、窗口之间进行交互步骤。

6.1)、删除App.xaml文件。
6.2)、新建一个App的类且继承自Application,在里面设置窗口启动项,在写一个Window类型的集合。
6.3)、在主窗口实例化子窗口时,为子窗口设置Ower属性等于主窗口。
6.4)、在子窗口中通过Application.Current.MainWindow属性得到主窗口对象,并调用方法。
6.5)、在主窗口中循环遍历集合中的数据进行设置子窗口。
App类:

  1. public class App : Application
  2. {
  3. [STAThread]
  4. public static void Main()
  5. {
  6. //实例化类。
  7. App app = new App();
  8. app.InitializeComponent();
  9. app.Run();
  10. }
  11. private void InitializeComponent()
  12. {
  13. //设置主窗口启动项。
  14. this.StartupUri = new Uri("MainWindow.xaml", UriKind.Relative);
  15. }
  16. //声明一个Window类型的集合,用于放置子窗口。
  17. private List<Window> listWindow = new List<Window>();
  18. public List<Window> ListWindow
  19. {
  20. get { return listWindow; }
  21. set { this.listWindow = value; }
  22. }
  23. }

MainWinow后台代码:

  1. public partial class MainWindow : Window
  2. {
  3. public MainWindow()
  4. {
  5. InitializeComponent();
  6. this.Loaded += MainWindow_Loaded;
  7. }
  8. void MainWindow_Loaded(object sender, RoutedEventArgs e)
  9. {
  10. //窗口加载的时候把Winow1窗口弹出来。
  11. Window1 w1 = new Window1();
  12. //为Window1Owner属性。
  13. w1.Owner = this;
  14. //显示出来。
  15. w1.Show();
  16. //将Winow1加入到集合中。
  17. ((App)App.Current).ListWindow.Add(w1);
  18. }
  19. /// <summary>
  20. /// 此方法用于将主窗口标题设置为当前时间。
  21. /// </summary>
  22. public void SetMainWinowTime()
  23. {
  24. this.Title = DateTime.Now.ToString();
  25. }
  26. /// <summary>
  27. /// 此方法用于设置子窗口标题为当前时间。
  28. /// </summary>
  29. /// <param name="sender"></param>
  30. /// <param name="e"></param>
  31. private void Button_Click(object sender, RoutedEventArgs e)
  32. {
  33. for (int i = 0; i < ((App)App.Current).ListWindow.Count; i++)
  34. {
  35. //将集合中的向转换为Window1对象,然后调用SetWindowTime()方法。
  36. ((Window1)((App)App.Current).ListWindow[i]).SetWindowTime();
  37. }
  38. }
  39. }

Window窗口后台代码:

  1. public partial class Window1 : Window
  2. {
  3. public Window1()
  4. {
  5. InitializeComponent();
  6. }
  7. /// <summary>
  8. /// 此方法用于设置子窗口标题为当前时间。
  9. /// </summary>
  10. public void SetWindowTime()
  11. {
  12. this.Title = DateTime.Now.ToString();
  13. }
  14. /// <summary>
  15. /// 此方法用于获取主窗口,然后调用SetMainWinowTime()方法。
  16. /// </summary>
  17. /// <param name="sender"></param>
  18. /// <param name="e"></param>
  19. private void Button_Click(object sender, RoutedEventArgs e)
  20. {
  21. ((MainWindow)Application.Current.MainWindow).SetMainWinowTime();
  22. }
  23. }

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类:

  1. public class SignelInstanceApplication : System.Windows.Application
  2. {
  3. /// <summary>
  4. /// 重写OnStartup()方法,在方法中实例化主窗口。
  5. /// </summary>
  6. /// <param name="e"></param>
  7. protected override void OnStartup(System.Windows.StartupEventArgs e)
  8. {
  9. base.OnStartup(e);
  10. //在OnStartup()方法中实例化窗口对象(在这里是主窗口)。
  11. MainWindow mw = new MainWindow();
  12. mw.Show();
  13. }
  14. /// <summary>
  15. /// 此方法用于激活当前窗口(让窗口显示最前端)。
  16. /// </summary>
  17. public void Activate()
  18. {
  19. System.Windows.MessageBox.Show("此程序已运行"); //再做其他的处理。
  20. this.MainWindow.Show();
  21. this.MainWindow.Activate();
  22. }
  23. }

SignelApplicationManager类:

  1. class SignelApplicationManager : WindowsFormsApplicationBase
  2. {
  3. //声明application对象。
  4. SignelInstanceApplication app;
  5. /// <summary>
  6. /// 在构造函数中设置IsSingleInstance为单例模式。
  7. /// </summary>
  8. public SignelApplicationManager()
  9. {
  10. //IsSingleInstance:确定此应用程序是否为单例应用程序。
  11. this.IsSingleInstance = true;
  12. }
  13. /// <summary>
  14. /// 在OnStartup方法中实例化SignelInstanceApplication对象。
  15. /// </summary>
  16. /// <param name="eventArgs"></param>
  17. /// <returns></returns>
  18. protected override bool OnStartup(StartupEventArgs eventArgs)
  19. {
  20. base.OnStartup(eventArgs);
  21. //实例化SignelInstanceApplication对象。
  22. app = new SignelInstanceApplication();
  23. app.Run();
  24. //返回false。
  25. return false;
  26. }
  27. /// <summary>
  28. /// 在OnStartupNextInstance调用激活函数。
  29. /// </summary>
  30. /// <param name="eventArgs"></param>
  31. protected override void OnStartupNextInstance(StartupNextInstanceEventArgs eventArgs)
  32. {
  33. base.OnStartupNextInstance(eventArgs);
  34. app.Activate();
  35. }
  36. }

Startup类:

  1. public class Startup
  2. {
  3. [STAThread()]
  4. public static void Main(string[] args)
  5. {
  6. //实例化SignelApplicationManager对象。
  7. SignelApplicationManager sm = new SignelApplicationManager();
  8. //调用Run()。
  9. sm.Run(args);
  10. }
  11. }