WPF中的Application类。

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

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);
    }
}

原文地址:https://www.cnblogs.com/lonelyxmas/p/9479043.html

时间: 2024-10-31 04:43:20

WPF中的Application类。的相关文章

浅析C#(WPF)中的Application类

Application类 封装WFP应用程序. 命名空间:System.Windows 语法:public class Application : DispatcherObject, IQueryAmbient 可以看到Application继承了DispatcherObject类和IQueryAmbient接口. 首先看一下DispatcherObject类 DispatcherObject类 表示与Dispatcher关联的对象 命名空间:System.Windows.Threading 语

WPF中的常用类汇总:

1.FrameworkElement: WPF中大部分的控件都可以转化成FrameworkElement,利用FrameworkElement属性获取相应的值: 2.WPF获取当前工作区域的宽度和高度 SystemParameters.PrimaryScreenWidth  ---获取工作区域的宽度 SystemParameters.PrimaryScreenHeight ---获取工作区域的高度 3.DependencyObject: 该类是所有控件类型的父类:利用该类可以获取某些抽象属性:

WPF 中关于 DataTemplateSelector 类的应用

MSDN的解释: 提供一种根据数据对象和与该数据绑定的元素来选择数据模板 DataTemplate 的方法. 示例代码: <Window x:Class="WpfApplication1.Window2" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

WPF Application 类介绍以及WPF异常处理

现在把wpf中的application和特殊的异常处理办法公布如下: wpf中对启动窗体等的控制 是APP.XAML文件和其cs文件下面,可以在XAML中进行编码,也可以在后台cs代码中编码 首先讲解Application类 属性: Current                  获取当前 AppDomain的 Application 对象 MainWindow           获取或设置应用程序的主窗体.(下面详细介绍) Resources              获取或设置应用程序范

Android Application 类共享全局数据

android系统会为每个程序运行时创建一个Application类的对象且仅创建一个,所以Application可以说是单例模式的一个类.且application对象的生命周期是整个程序中最长的,它的生命周期就等于这个程序的生命周期.因为它是全局的单例的,所以在不同的Activity,Service中获得的对象都是同一个对象.所以通过Application来进行一些,数据传递,数据共享 等,数据缓存等操作,代码如下: package com.example.five; import andro

WPF中的MatrixTransform

原文:WPF中的MatrixTransform WPF中的MatrixTransform                                                                              周银辉 虽然在WPF中可以使用TranslateTransform.RotateTransform.ScaleTransform等进行几何变换,但我们也可以使用更底层的MatrixTransform(矩阵变换)来进行更复杂的复合变换. 首先我们矩阵如何影响

正确理解WPF中的TemplatedParent

(注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于名称不是很统一,文中统一用英文名称代表两个概念,况且VisualTreeHelper和LogicalTreeHelper也是WPF中提供的类名称) 众所周知WPF中的Logical Tree是逻辑上定义的元素层次树,而实际上显示在屏幕上的元素层次树是Visual Tree,Visual Tree是 (注:Logical Tree中文称为逻辑树,Visual Tree中文称为可视化树或者视觉树,由于

六,WPF的Application类

Application.ShutdownMode属性:通过,只要有一个窗口还没有关闭,Application类就保持应用程序处于有效状态,如果这不是所期望的行为,就可以调整该属性. 应用程序事件 Application提供了为数不多的几个非常有用的事件,如下图所示: 有两种选择用于处理事件:在XAML中使用事件特性的方式关联事件处理程序,或重写相应的受保护方法,当重写应用程序方法时,推荐首先调用基类的实现,通常,基类的实现只是引发相应的应用程序事件. 初始界面(SplashScreen) WPF

博客园WPF Application类

所有的WPF程序,都是由Application类实例创建,该类负责打开当前应用程序和窗体,并且决定如何关闭应用程序等.Application类的主要功能可以简单总结以下几点: 1.保持主线程 使用Application后,只要有窗体没有退出,则应用程序不会退出,他会重新定义出新的主窗体,只有所有的窗体都关闭,Appliction才决定是否退出应用程序.Application起到管理所有窗体的作用.看如下代码: class Program { [STAThread()] static void M