WPF中的Application类。

简介: 原文:WPF中的Application类。Application对象用的名称空间是system.windows 1、手动创建Application对象步骤。 1.1)、把项目中的App.Xaml文件从项目中排除。
原文: 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);
    }
}

 

目录
相关文章
|
5月前
|
XML 开发框架 .NET
|
7月前
|
开发框架 .NET C#
2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>
32 0
|
C#
WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)
原文:WPF 4 Ribbon 开发 之 应用程序菜单(Application Menu)      在上一篇中我们完成了快捷工具栏的开发,本篇将讲解应用程序菜单开发的相关内容。如下图所示,点击程序窗口左上角的记事本图标(Application Button)会显示出应用程序菜单(Application Menu)列表,列表中的按键即为软件的一些基本功能。
2112 0
|
C#
在WPF中使用FontAwesome之类的字体图标
原文:在WPF中使用FontAwesome之类的字体图标 我之前在博客中介绍过几个矢量图库网站,在WPF程序中,一般接触到的矢量图标资源有XAML、SVG、字体这三种格式。XAML是标准格式就不说了,SVG并不是直接支持的,不过微软提供了Expression Design可以非常方便我们将其转换为XAML格式的资源。
1355 0
|
数据可视化 C# 前端开发
WPF中的3D特性和常见的几个类
原文:WPF中的3D特性和常见的几个类 WPF 3D 常用的几个类及其关系 1.  Visual 类      所有二维可视化元素的基类,为 WPF 中的呈现提供支持,其中包括命中测试、坐标转换和边界框计算。
1090 0
|
C#
WPF 属性变更通知类的实现
原文:WPF 属性变更通知类的实现 平时用依赖属性多一些,普通属性的变更通知知道有这个方法,但是老是忘记名字,再写一遍吧。
981 0
|
前端开发 C# 开发者
WPF MVVM 架构 Step By Step(3)(把后台代码移到一个类中)
原文:WPF MVVM 架构 Step By Step(3)(把后台代码移到一个类中)   我觉得大部分开发者应该已经知道怎么去解决这个问题。一般都是把后台代码(GLUE code)移动到一个类库。这个类库用来代表UI的属性和行为。
1022 0
|
C#
WPF整理-Mutex确保Application单例运行
原文:WPF整理-Mutex确保Application单例运行 有时我们不希望我们的WPF应用程序可以同时运行有多个实例,当我们试图运行第二个实例的时候,已经运行的实例也应该弹出来。 我们可以用Mutex来实现 打开App.
1312 0
|
前端开发 C# 程序员
WPF整理-XAML构建后台类对象
原文:WPF整理-XAML构建后台类对象 1.XAML 接触WPF的第一眼就是XAML---XAML是用来描绘界面的。其实不然! "Actually, XAML has nothing to do with UI. It's merely a declarative way of constructing objects and setting their properties.” XAML和UI一点关系也没有,它仅仅是一种以声明方式来构建对象,设置对象属性的一种方式而已,和code behind file作用差不多。
919 0
|
C#
【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的
原文:【C#】WPF的xaml中定义的Trigger为什么有时候会不管用,如Border的MouseOver之类的 初学WPF,知道一些控件可以通过定义Style的Trigger改变要显示的样式,但是经常遇到一些明明Trigger已经触发了,但是里面Setter设置的样式,却没有效果的问题。
1217 0