创建一个简单的WPF应用

简介: (一)创建一个简单的WPF应用首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版。

(一)创建一个简单的WPF应用

首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版。因为WPF模版封装了创建WPF应用所需要的各种基本元素,并不利于我们学习。


 

创建一个WPF需要引用的最基本的DLL

1、PersentationCore                       WPF的核心类库

2、PersentationFramework             封装了与WPF控件相关类型的类库

3、System.Xaml                             XAML解析的类库

4、WindowBase                              Window窗体相关的类库

 

引入了这四个类库之后 我们就可以创建自己的WPF App了

 

Demo:

复制代码
class SimpleWPF
    {
        //与Console、Winform一样 WPF自身也是单线程模型
        [STAThread]
        static void Main()
        {
            //Window 是WPF中标准的窗体呈现方式   
            Window mainWindow = new Window();
            mainWindow.Title = "这是一个简单的WPF应用";
            
            //Application类型用于创建一个消息循环 使用户可以接受来自输入设备的输入
            Application app = new Application();

            Console.WriteLine("Simple WPF Running");

            app.Run(mainWindow);


            #region 等效方式

            //mainWindow.Show();//显示窗体
        //app.Run();//先建立消息循环
#endregion } }
复制代码

在这个例子里 大家应该可以看到 在单线程的主入口点中,我声明了一个Window对象 和一个Application对象。

这两个对象是做什么的呢?我在这里解释下

 

System.Windows.Application对象 是创建一个消息循环,用以接受用户的各类输入事件,以及阻止控制台程序的结束

System.Windows.Window对象  是WPF中标准的窗体类型。

这里提供了一个继承关系的树形截图

  

 

从此截图可以看出 Window类型实际是一个ContentControl类型。 对于Control类型的讲解,我们会后期的文章中说明

Window类型还有一个孪生兄弟 叫UserControl,位于System.Windows.Controls命名空间下,UserControl与Window不同,Window会被视为窗体,而UserControl顾名思义被视为一个封装好的用户控件。

 

Application在运行的时候,可以创建一个默认Window窗体并直接调用窗体的Show()方法进行显示,也可以由Window调用自己的Show()并调用Application的Run()方式来完成窗体的显示以及消息循环的建立。同时Application会将第一个调用了Show()的窗体认作MainWindow 并可以通过Application的MainWindow属性获取及设置新的MainWindow

 

因为程序是通过控制台来创建的GUI,我们在运行时除了会看到Window窗体,还会看到Console控制台。我们可以通过Console.WriteLine()来输出各类调试信息,因此在程序发布之前 建议使用这种方式来进行调试。如果不希望看到Console,可以修改项目属性为Windows应用程序,如下图

 

以上就是如何创建一个简单的WPF应用了,很多人可能还会疑惑,这么创建的WPF应用程序跟拿模版创建的差距咋就那么大呢,下面我用一个例子来告诉大家,模版都做了什么,它的好处在哪。

 

  这是一个模版生成的WPF应用程序。我们来模拟它

 

  MainWindow 我们只关心他的cs文件, MainWindow类型也是继承自Window类型,在MainWindow类型里 我们可以重写On[Event]行为来达到对各种Window窗体的事件的处理

  App 分为两部分 一部分为Xaml 其中有个重要的属性StarupURI 定义了主窗体的类型,另一部分是App.Xaml.cs 继承自Application类型,让我们可以使用Application生命周期中产生的各种事件

  App生命周期中有三个特别重要的事件

  OnStartup 创建消息循环时触发

  OnExit       结束消息循环时触发

  OnSessionEnding 系统进行关机操作时触发

  在这个例子里 我们将对窗口的创建 延迟到了Application 的 Startup事件中,也就是由Application来管理窗体的创建和销毁

    上代码:

  主入口点 负责创建Application消息循环

复制代码
 
class Programs { [STAThread] static void Main() { App app = new App(); Console.WriteLine("App.Run()"); app.Run(); } }
复制代码

  Application类,我们在Stratup事件中创建Window实例,并且向控制台中输出创建信息

复制代码
 public class App : Application
    {
        /// <summary>
        /// 程序运行时触发的事件
        /// </summary>
        /// <param name="e"></param>
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            WPF_ApplicationAndWindow.NormalWPF.MainWindow mainWindow = new MainWindow();


            Console.WriteLine("Application StartUp And Main Window.Show()");
            mainWindow.Show();
        }

        //关机时触发的事件
        protected override void OnSessionEnding(SessionEndingCancelEventArgs e)
        {
            base.OnSessionEnding(e);

            Console.WriteLine("Session Ending");
        }

        //退出WPF时触发的事件
        protected override void OnExit(ExitEventArgs e)
        {
            base.OnExit(e);

            Console.WriteLine("Exit Application");
        }
    }
复制代码

Window 这个就不多说啥了

复制代码
public class MainWindow : Window
    {
        public MainWindow()
        {
            this.Title = "MainWindow";

        }
        //获取鼠标在窗体内的点击事件
        protected override void OnMouseDown(System.Windows.Input.MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);
            
            //由于此窗体就是接受事件的窗体 所以这里用This
            string message = string.Format("MouseDown on Point {0}", e.GetPosition(this));


            //输出控制台
            Console.WriteLine(message);

            MessageBox.Show(message, this.Title);
        }
    }
复制代码

 

  Application对象常用属性

  1、MainWindow

  获取当前Application中的主窗体,如果不进行修改,默认获取到的是第一个调用Show()的窗体对象

  2、Windows

  获取当前Application管理的所有窗体实例 集合类型

  3、ShutdownModel

  这是一个枚举类型,用以决定何时应该结束这个Application的声明周期,枚举值有三个

  OnExplicitShutdown  只有在调用Application.Shutdown()方法时 才能结束生命周期

  OnLastWindowClose 当Application所管理的所有窗体都关闭时 结束生命周期

  OnMainWindowClose 当Application所管理的MainWindow关闭时 结束生命周期

  4、Current (Static)

  这是一个静态属性,直接通过Application.Current获取,这个属性获取了当前使用的Application实例

  Window对象的常用属性

  1、Owner 

  设置当前实例化的窗体隶属于哪个窗体,当设置此属性后,当前实例化窗体会受设置的窗体管理,具有相同的生命周期,并且会一直显示在设置的窗体前面

  2、Owners

  获取当前窗体所拥有的所有子窗体列表

  3、ShowInTaskBar

  这是一个bool类型,决定窗体是否会显示在Windows任务栏中

  4、WindowStartupLocation

  枚举类型,决定了窗体初始显示位置

  5、WindowStyle

  枚举类型,决定了窗体边框类型 默认为SingleBorderWindow 拥有一个最大化、最小化、关闭按钮

  6、WindowState

  枚举类型,决定了窗体在Show()之后的显示方式 默认为Normal  最大化 最小化 还是正常显示

 

  本篇就讲到这里,下一篇会讲与WPF相关的一个很重要的概念 “设备无关像素/逻辑像素"

  

  Tips:

  说句心里话,每次写Blog都很揪心,很忐忑。生怕自己写错了什么,误导了别人,也给自己挖了坑。这篇文章里的东西不一定完全正确,因为毕竟我也算是一个初学者,如果有谁看到了其中的失误或者错误,请及时提醒我。曾经也做过WPF的项目,拖拽控件、查找源码,用过MVVM模式,也是一个CCCV CCAV党,虽然号称有半年的WPF开发经验,实际上真正从头系统了解WPF的时候,才发现了自己曾经一知半解的很多,误解的知识也很多。希望以后的日子里能跟大家共同进步,摆脱拖拽工人的模式……

 

  这里提供附件下载(.Net 4.0+VS2010开发): 

  http://files.cnblogs.com/ShadowLoki/WPF_ApplicationAndWindow.rar 


相关文章
|
C#
用Microsoft.Solver.Foundation进行线性规划,为WPF应用添加智能
原文:用Microsoft.Solver.Foundation进行线性规划,为WPF应用添加智能   在管理信息系统的开发过程中,往往会涉及到一些线性规划数学模型,例如资源配置优化。微软的Microsoft.Solver.Foundation是一个数学库,可以很好的对线性规划问题进行求解。
1373 0
|
C#
[WPF]为旧版本的应用添加触控支持
原文:[WPF]为旧版本的应用添加触控支持 之前做WPF开发时曾经遇到这样一个需求:为一个基于 .NET Framework 3.5开发的老旧WPF程序添加触控支持,以便于大屏触控展示。 接手之后发现这是一个大坑。
882 0
|
C# Windows
WPF程序在Windows 7下应用Windows 8主题
原文:WPF程序在Windows 7下应用Windows 8主题 这篇博客介绍如何在Windows 7下应用Windows 8的主题。 首先我们先看一个很常见的场景,同样的WPF程序(样式未重写)在不同的操作系统上展示会有些不同。
1012 0
|
C# 编解码 区块链
WPF中应用字体图标
原文:WPF中应用字体图标 一、什么是字体图标          我们在进行GDI(图形界面)编程的过程中图标是不可少的。近些年随着网络的繁荣和移动应用的繁荣,矢量图的应用越来越火。          矢量图是一种用数学方法描述的、由一系列点和线组成的图,因此相比位图文件比较小,并且还和分辨率无关。
962 0
|
C# 容器
WPF模板(二)应用
原文:WPF模板(二)应用           本次内容来源于电子书,和上一篇一样。 在WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.其中ControlTemplate和ItemsPanelTemplate是控件模板,DataTemplate是数据模板,他们都派生自FrameworkTemplate抽象类。
788 0
|
C# Windows
使WPF程序应用预置的控件风格, 如Aero, Luna, Royale, Classic等
原文:使WPF程序应用预置的控件风格, 如Aero, Luna, Royale, Classic等      WPF预设有Aero, Classic, Luna, Royale主题, WPF程序会根据Windows主...
1231 0
|
消息中间件 C# Windows
WPF的消息机制(一)- 让应用程序动起来
原文:WPF的消息机制(一)- 让应用程序动起来 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/powertoolsteam/article/details/6106485 ...
1032 0
|
C# Windows Web App开发
WPF 应用完全模拟 UWP 的标题栏按钮
原文:WPF 应用完全模拟 UWP 的标题栏按钮 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
1038 0
|
C# 数据安全/隐私保护 Windows
WPF Event 在 Command 中的应用初级篇,支持所有Event 展示松耦合设计的全部代码 - 解决TextBoxBase.TextChanged或者TextBox.TextChanged等类似事件绑定问题。
原文:WPF Event 在 Command 中的应用初级篇,支持所有Event 展示松耦合设计的全部代码 - 解决TextBoxBase.TextChanged或者TextBox.TextChanged等类似事件绑定问题。
1286 0
|
C# 小程序
WPF 3D变换应用
原文:WPF 3D变换应用  WPF可以提供的3D模型使我们可以轻松地创建3D实体,虽然目前来看还很有一些性能上的问题,不过对于一些简单的3D应用应该是可取的,毕竟其开发效率高,而且也容易上手。         下面给大家演示的是使用在WPF 3D上实现视角变换,通过鼠标拖动来变换观察视角,通过滚轮来放缩视距。
702 0