WInform 创建一个简单的WPF应用

时间:2022-02-20 00:51:42

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

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


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

1、PersentationCore                       WPF的核心类库

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

3、System.Xaml                             XAML解析的类库

4、WindowBase                              Window窗体相关的类库

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

Demo:

WInform 创建一个简单的WPF应用
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 } }
WInform 创建一个简单的WPF应用

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

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

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

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

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

  WInform 创建一个简单的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应用程序,如下图

WInform 创建一个简单的WPF应用

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

  WInform 创建一个简单的WPF应用这是一个模版生成的WPF应用程序。WInform 创建一个简单的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消息循环

WInform 创建一个简单的WPF应用
class Programs
{
[STAThread]
static void Main()
{
App app = new App(); Console.WriteLine("App.Run()"); app.Run();
}
}
WInform 创建一个简单的WPF应用

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

WInform 创建一个简单的WPF应用
 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");
}
}
WInform 创建一个简单的WPF应用

Window 这个就不多说啥了

WInform 创建一个简单的WPF应用
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);
}
}
WInform 创建一个简单的WPF应用

  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的时候,才发现了自己曾经一知半解的很多,误解的知识也很多。希望以后的日子里能跟大家共同进步,摆脱拖拽工人的模式……

WInform 创建一个简单的WPF应用的更多相关文章

  1. C&num;-用Winform制作一个简单的密码管理工具

    为什么要做? 首先是为了练习一下c#. 想必大家都有过记不起某个平台的账号密码的经历,那种感受着实令人抓狂.那这么多账号密码根本记不住!我之前用python写过一个超级简单(连账号信息都写在代码里那种 ...

  2. 如何创建一个简单的Visual Studio Code扩展

    注:本文提到的代码示例下载地址>How to create a simple extension for VS Code VS Code 是微软推出的一款轻量级的代码编辑器,免费,开源,支持多种 ...

  3. 《Entity Framework 6 Recipes》翻译系列 &lpar;3&rpar; -----第二章 实体数据建模基础之创建一个简单的模型

    第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以 ...

  4. 如何创建一个简单的C&plus;&plus;同步锁框架&lpar;译&rpar;

    翻译自codeproject上面的一篇文章,题目是:如何创建一个简单的c++同步锁框架 目录 介绍 背景 临界区 & 互斥 & 信号 临界区 互斥 信号 更多信息 建立锁框架的目的 B ...

  5. Windows 8&period;1 应用再出发 &lpar;WinJS&rpar; - 创建一个简单项目

    前面几篇我们介绍了如何利用 C# + XAML 完成Windows Store App 功能的实现,接下来的几篇我们来看看如何利用 Html + WinJS 来完成这些功能. 本篇我们使用WinJS ...

  6. ADF&lowbar;General JSF系列1&lowbar;创建一个简单的JSF Application

    2015-02-17 Creatd By BaoXinjian

  7. IntelliJ IDEA 15 部署Tomcat及创建一个简单的Web工程

    一.部署Tomcat 二.创建一个简单的Web工程 2.1创建一个新工程 创建一个新工程 设置JDK及选择Web Application (创建的是Web工程) 点击Next,选择工作空间,起个工程名 ...

  8. Symfony2之创建一个简单的web应用

    Symfony2——创建bundle       bundle就像插件或者一个功能齐全的应用,我们在应用层上开发的应用的所有代码,包括:PHP文件.配置文件.图片.css文件.js文件等都会包含在bu ...

  9. 如何创建一个简单的struts2程序

    如何创建一个简单的Struts2程序 “计应134(实验班) 凌豪” 1.创建一个新的Web项目test(File->new->Web Project) 2.Struts2框架的核心配置文 ...

随机推荐

  1. JavaScript的push&lpar;&rpar;&comma;pop&lpar;&rpar;&comma;concat&lpar;&rpar;方法

    push 方法 将新元素添加到一个数组中,并返回数组的新长度值. arrayObj.push([item1 [item2 [. . . [itemN ]]]]) 参数 arrayObj 必选项.一个  ...

  2. Oracle-操作

    登录PL_SQL,输入用户名sys 密码 安装时输入的密码,选择 sysdba 打开plsqldev.exe所在目录下的PlugIns文件夹,如果没有请从其它地方拷入 打开运行命令窗口,输入命令 re ...

  3. uclibc和glibc的差别

    uClibc和Glibc并不相同,两者有许多不同之处,而且以下不同有可能给你带来一些问题. 1. uClibc比Glibc小,虽然uClibc和Glibc在已有的接口上是兼容的,而且采用uClibc编 ...

  4. 解析与动作联动得SDN数据平面

    一种解析与执行联动的SDN可编程数据平面 现有问题和目标 在传统协议处理方式中,各层的协议类型和组合方式固定,使得添加或修改协议很困难(因为需要修改网络设备的解析模式) 基于解析和执行联动结构的可编程 ...

  5. 关于 Form 表单的 enctype 属性

    enctype 属性一共有3个值 application/x-www-form-urlencoded 在发送前编码所有字符(默认) multipart/form-data 上传二进制数据, 所以在使用 ...

  6. ElasticSearch是如何实现分布式的?

    面试题 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)? 面试官心理分析 在搜索这块,lucene 是最流行的搜索库.几年前业内一般都问,你了解 lucene 吗?你知道倒排索引的原理 ...

  7. B&plus;Tree原理及mysql的索引分析

    一.索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构.提取句子主干,就可以得到索引的本质:索引是数据结构. 我们知道,数据库查询是数据库的最主要功能之 ...

  8. LeetCode144:Binary Tree Preorder Traversal

    题目: Given a binary tree, return the preorder traversal of its nodes' values. For example: Given bina ...

  9. 解决ListView中Item的子控件与Item点击事件冲突

    常常会碰到在ListView中点击当中一个Item.会一并触发其子控件的点击事件.比如Item中的Button.ImageButton等.导致了点击Item中Button以外区域也会触发Button点 ...

  10. &lbrack;JSOI2010&rsqb;部落划分

    嘟嘟嘟 一道不错的题,解法不少. 最易于理解的是最小生成树的做法: 首先每两个点之间都连一条长度为这两个点的距离的边,形成完全图. 然后跑最小生成树,直到剩k个联通块,这时候合并成k - 1个联通块的 ...