zoukankan      html  css  js  c++  java
  • WPF的Application类

    本节主要介绍一下Application类的部分功能,我们首先来看一下如何使用Application类来加载一个窗口:

    我们首先创建一个控制台程序,并引入相关的dll,然后修改Main()方法。

        [STAThread]
        private static void Main()
        {
    
            var app = new Application();
            var win = new Window1();
            app.Run(win);
    
            //另一种方法创建一个主窗口并显示
            //var app = new Application(); 
            //var window1 = new Window1();
            //app.MainWindow = window1;
            //window1.Show();
            //app.Run();
    
            Console.WriteLine("Window1 Closed");
        }

    该示例中用了两种方法通过Application类来加载窗口。该窗口会被作为主窗口显示。当代码执行Run()方法的时候,会触发Application.StartUp事件,该事件执行完之后才显示主窗口。不管是用上面的那种方法,应用程序一直运行,直到主窗口和其他所有窗口都关闭,Run()方法才返回,并在应用程序结束之前,执行Run()方法后面的代码。

    下面我们来介绍一下常规的WPF应用程序,并且主要也使用这种方法。 

    我们在用Visual Studio创建WPF应用程序的时候,可以使用它提供的WPF Application模板。它会为我们创建一个App.xaml和App.xaml.cs文件。我们查看App.xaml文件,会发现有一个StartupUri="MainWindow.xaml",它的含义是指定程序的主窗口;在程序自动生成的文件App.g.i.cs中,会用到这个值,它是一个URI格式的值。我们再查看代码隐藏文件App.xaml.cs,发现只有一个继承自System.Windows.Application的App部分类。

    最初,App类是没有包含任何代码的。但是我们可以添加代码来处理应用程序事件,接下来我们来看看Application类中几个重要的事件:

    Startup:在Application.Run()方法之后,显示主窗体之前发生。还可以用这个事件的StartupEventArgs.Args属性,获取程序集命令行参数。甚至还可以在该事件里面创建和显示主窗口,而不适用App.XAML中的StartupUri。

    Exit:该事件发生在应用程序关闭之前,不能撤销(不管是何种原因关闭:调用Shutdown方法、Windows用户注销或者关闭结束回话等)。

    SessionEnding:发生,当用户在注销或关闭操作系统关闭 Windows 会话。可以通过检查SessionEndingCancelEventArgs.ReasonSessionEnding属性值来明确原因。如果要防止应用程序关闭,可以设置SessionEndingCancelEventArgs.Cancel属性值为true(默认为false)。

    Activated:当应用程序的一个窗口被激活的时候发生(包括:启动主窗口的时候;对应用程序的用户切换通过使用 ALT+TAB 或使用任务管理器;用户单击某一的任务栏按钮在应用程序的窗口)。

    Deactivated:当应用程序的一个窗口被取消激活的时候发生。

    DispatcherUnhandledException:在应用程序中的任何位置,只要发生一个任何未处理的异常,就会发生该事件。我们甚至可以在该事件中使用DispatcherUnhandledExceptionEventArgs.Handled属性,并设置为true(默认为false),让程序继续运行。

    有2中选择用于处理事件:通过App.xaml关联事件处理程序;或者直接通过重写相应的受保护的方法。

    我还可以通过ShutdownMode改变应用程序的关闭方式,有以下三种方式:

    OnLastWindowClose:应用程序关闭时,或最后一个窗口关闭时关闭,或者Shutdown()方法调用。这是默认的行为。

    OnMainWindowClose:应用程序关闭时,或主窗口关闭时关闭,或者Shutdown()方法调用。

    OnExplicitShutdown:仅当Shutdown()方法调用时,应用程序关闭。在此模式下,如果不调用Shutdown()方法,应用程序一直都不会结束(即使所有窗口都已经关闭)。

    我们已经对WPF的Application类已经有了一定的了解,接下来我们看看其他一些情况:

    访问当前Application对象:通过静态的Application.Current属性,可以在应用程序的任何位置获取当前应用程序实例。

        var app = Application.Current;
        var main = (MainWindow)app.MainWindow;//转换为正确的窗口类型
        foreach (var window in app.Windows)
        {
    
        }

    这个例子中需要注意的一点就是:Application.Current.Windows这个属性的值是。当窗口(包括主窗口)显示时,它们会被添加到Windows集合中;而当窗口关闭的时候,会从Windows集合中移除该窗口。

    单实例应用程序:

    通常,只要愿意,我们就可以加载WPF应用程序的任意多个副本。在某些情况下,这是非常合理的。但是在另外一些情况下,这可能是一个问题。我们可以先来看一篇文章,然后再来看一个具体的例子:

    1.我们首先创建一个WPF应用程序,然后删除掉App.xaml文件和其代码后置文件

    2.项目添加Microsoft.VisualBasic.dll文件引用

    3.创建一个名为App的类文件,并让该App类继承System.Windows.Application

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
    
            var main = new MainWindow();
            main.Show();
        }

    4.创建一个名为SingleInstanceApplicationWrapper的类文件,并让该类继承Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase

        public class SingleInstanceApplicationWrapper : WindowsFormsApplicationBase
        {
    
            /// <summary>
            /// WPF App
            /// </summary>
            private App _app;
    
            public SingleInstanceApplicationWrapper()
            {
                IsSingleInstance = true;
            }
    
            protected override bool OnStartup(StartupEventArgs eventArgs)
            {
                base.OnStartup(eventArgs);
    
                _app = new App();
                _app.Run();
    
                return false;//这里一定要返回false,指示应用程序是否应继续启动。
            }
        }

    5.接下来我们就需要创建一个程序入口文件Program.cs

        public class Program
        {
    
            [STAThread]
            public static void Main(string[] args)
            {
                var single = new SingleInstanceApplicationWrapper();
                single.Run(args);
            }
    
        }

    这样,我们一个简单的只能运行单实例的应用程序就创建成功了。接下来基于上面的代码,构建基于文档的应用程序。

    6.创建一个读取文档的窗口Document.xaml,用于显示读取文档的内容:

        /// <summary>
        /// Interaction logic for Document.xaml
        /// </summary>
        public partial class Document : Window
        {
            public Document()
            {
                InitializeComponent();
            }
    
            private DocumentReference _docRef;
    
            public void LoadFile(DocumentReference docRef)
            {
                _docRef = docRef;
                Content = File.ReadAllText(docRef.Name);
                Title = docRef.Name;
            }
    
            protected override void OnClosed(EventArgs e)
            {
                base.OnClosed(e);
    
                ((App)Application.Current).Documents.Remove(_docRef);
            }
        }

    7.创建一个实体类DocumentReference,用于MainWindow.xaml的ListBox控件绑定数据源

        public class DocumentReference
        {
            public DocumentReference(Document document, string name)
            {
                Document = document;
                Name = name;
            }
    
            public Document Document { get; set; }
    
            public string Name { get; set; }
        }

    我们编辑Solution的Properties,修改Debug选项卡的Command line arguments,如果多个参数需要空格。

    这样我们运行程序的时候,就会自动的打开文档了。还需要注意的一点就是把项目中的所有.testDoc文档Copy to Output Directory修改为,Copy always。

    代码文件

  • 相关阅读:
    查看硬件的一些命令
    InfluxDB部署和使用
    利用mysql时间函数监控表中有没有当天数据
    js基础_for循环(学习笔记)
    JS基础_运算符的优先级
    JS基础_相等运算符
    Apache安装与卸载(win10系统测试)
    MySQL --添加环境变量教程
    MySQL安装教程及遇到的错误提示
    如何完全卸载MySQL
  • 原文地址:https://www.cnblogs.com/Mind-Hacker/p/3490170.html
Copyright © 2011-2022 走看看