本节主要介绍一下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。

 

代码文件

 

 

 

 

posted @ 2013-12-26 14:08 Mind-Hacker 阅读(1901) 评论(1) 推荐(2) 编辑
摘要: 首先我们必须知道在WPF中,控件通常被描述为和用户交互的元素,也就是能够接收焦点并响应键盘、鼠标输入的元素。我们可以把控件想象成一个容器,容器里装的东西就是它的内容。控件的内容可以是数据,也可以是控件。控件的内容也是内存中的对象。控件通过自己的某个属性引用着作为内容的对象,这个属性称为Content Property(内容属性)。当然这个内容属性具体到每种控件上都有自己的名字和类型:有的是object类型的Content,有的是object的Child;有些控件的内容是实现了集合接口的Items、Children等。我们常见的控件,大致可以分为如下几类:·内容控件·带有标题 阅读全文
posted @ 2013-12-24 11:06 Mind-Hacker 阅读(916) 评论(0) 推荐(0) 编辑
摘要: 我们首先来了解一下图形化用户界面(Graphic User Interface)也就是我们常常听到的GUI。举个简单的例子,同样是数据,我们可以用控制台程序加格式控制符等输出,但是这些都不如GUI来的友好和方便。WPF相对于其它只能使用编程语言进行UI设计,具有专门用于UI设计的XAML,并且能够确保界面布局能恰倒好处的适应不同的窗口尺寸。我们来查看Window和Page的源码,发现Window的间接基类ContentControl和Page类都使用了一个object类型的Content属性。所以它只能包含一个元素,但是我们想放置多个元素怎么办呢?这个时候我们就需要使用布局容器。为什么布局容器 阅读全文
posted @ 2013-12-17 23:40 Mind-Hacker 阅读(1317) 评论(0) 推荐(0) 编辑
摘要: 这一节我们来简单介绍一下XAML的加载和编译,它包括如下三种方式:· 只使用代码·使用代码和未编译的XAML·使用代码和编译过的BAML一. 只使用代码我们首先创建一个简单的控制台应用程序。然后我们添加PresentationFramework.dll、PresentationCore.dll、WindowsBase.dll和System.Xaml.dll。然后,我们创建一个Window1.cs类文件: public class Window1 : Window { private Button _button; public Window1() ... 阅读全文
posted @ 2013-12-16 20:33 Mind-Hacker 阅读(698) 评论(0) 推荐(0) 编辑
摘要: 通过对前面2节对XAML的介绍,我们对XAML有了一定的认识。这一节我们来简单了解一下部分XAML命名空间(x:)语言功能。x命名空间映射的是http://schemas.microsoft.com/winfx/2006/xaml,它包含的类与解析XAML语言相关。与C#语言一样,XAML也有自己的编译器。XAML文档会被解析并编译,最终形成IL存储在程序集中。在解析和编译XAML的过程中,我们需要告诉编译器一些信息,比如XAML代码编译结果与那个C#代码的编译结果合并等。这些能让我们与XAML编译器沟通的工具就放在x名称空间中。通过x命名空间在XAML中出现的形式,我们可以分为如下几类:&# 阅读全文
posted @ 2013-12-16 15:12 Mind-Hacker 阅读(718) 评论(1) 推荐(1) 编辑
摘要: 通过上一节我们已经对XAML有了一定的了解,这一节我们来系统的学习一下XAML。一. 简单属性与类型转换器,属性元素:我们已经知道 XAML是一种声明性的语言,并且XAML解析器会为每个标签创建一个与之对应的对象。光有对象是没有任何意义的,需要对属性之类的赋值才有使用意义。所以就要求XAML为对象属性赋值。XAML中为对象属性赋值共有2种语法:· 使用字符串进行简单赋值·使用属性元素进行复杂赋值XAML为了使上面的设置起作用,System.Windows.Controls.TextBox类必须提供上面面这些属性。上面的设置中,有2个属性为枚举类型(VerticalAlign 阅读全文
posted @ 2013-12-13 17:23 Mind-Hacker 阅读(1249) 评论(0) 推荐(1) 编辑
摘要: XAML的全称是Extensible Application Markup Language,就是我们所说的可扩展应用程序标记语言。XAML可以应用到许多不同领域,但主要用于构建用户界面。XAML是一种单纯的声明型语言,也就是说,它只能用于声明一些UI元素、绘制UI和动画等;不能在其中加入程序逻辑,从根本上实现了UI和逻辑代码分离。XAML是一种由XML派生而来的语言,所以很多XML种的概念在XAML是通用的。我们通过Visual Studio创建一个WPF应用程序,来介绍一下XAML的命名空间以及一些基本要素:(至于怎么通过Visual Studio创建WPF Application这里就不 阅读全文
posted @ 2013-12-12 16:59 Mind-Hacker 阅读(736) 评论(0) 推荐(1) 编辑
摘要: WPF 全称是:Windows Presentation Foundation,直译为Windows表示基础。WPF是专门为GUI(Graphic User Interface)程序开发设计的。在过去很多年,用于GUI开发的技术一直都在改进。不管是Windows Form,还是Visual Basic 6等等,在底层都是使用Windows的 User32,GDI/GDI+ 这2个部分来构建用户界面。而WPF中,底层的图形技术不再是GDI/GDI+ ,而是DirectX。不管是用WPF绘制简单的文本框、按钮,还是到复杂的3D图形效果,都是采用DirectX完成的。如果要保证在WPF中获得硬件加速 阅读全文
posted @ 2013-12-11 13:59 Mind-Hacker 阅读(981) 评论(0) 推荐(0) 编辑
摘要: public class ServiceHost : ServiceHost { public void EnableMetadataExchange(bool enableHttpGet = true) { if (State == CommunicationState.Opened) { throw new InvalidOperationException("Host is already opened"); } var metada... 阅读全文
posted @ 2013-11-04 21:35 Mind-Hacker 阅读(300) 评论(0) 推荐(0) 编辑
摘要: 首先,我们要知道的是String类型是一个引用类型,它的基类是Object。并且它的内容是只读的。我们有时候经常会看到两个字符串类型,一个是“Sting”,一个是“string”。大写的String是System.String,也就是 公共语言规范(Common Language Specification) CLS 所定义的字符串类型;小写的string则是C#自己的字符串类型;最终C#编译器还是会把它和System.String联系起来。例如:string a = "a";a = "abc";我们来简单分析下这两段代码:1.第一段代码,首先会在托管堆 阅读全文
posted @ 2013-07-27 16:01 Mind-Hacker 阅读(763) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示