zoukankan      html  css  js  c++  java
  • WInform 创建一个简单的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的时候,才发现了自己曾经一知半解的很多,误解的知识也很多。希望以后的日子里能跟大家共同进步,摆脱拖拽工人的模式……

  • 相关阅读:
    利用win10自带的虚拟机Hyper-V安装Centos7的步骤教程
    Java元组Tuple介绍与使用
    Fiddler高级用法-设置断点
    Fiddler高级用法-抓取手机app数据包
    Fiddler基础用法-抓取浏览器数据包
    dig 命令
    curl 命令
    vmware虚拟机三种网络连接方式
    解决虚拟机vmware虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题
    linux 文件系统 xfs、ext4、ext3 的区别
  • 原文地址:https://www.cnblogs.com/wlming/p/5278291.html
Copyright © 2011-2022 走看看