创建一个简单的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 


相关文章
|
3月前
|
C# UED 开发者
WPF与性能优化:掌握这些核心技巧,让你的应用从卡顿到丝滑,彻底告别延迟,实现响应速度质的飞跃——从布局到动画全面剖析与实例演示
【8月更文挑战第31天】本文通过对比优化前后的方法,详细探讨了提升WPF应用响应速度的策略。文章首先分析了常见的性能瓶颈,如复杂的XAML布局、耗时的事件处理、不当的数据绑定及繁重的动画效果。接着,通过具体示例展示了如何简化XAML结构、使用后台线程处理事件、调整数据绑定设置以及利用DirectX优化动画,从而有效提升应用性能。通过这些优化措施,WPF应用将更加流畅,用户体验也将得到显著改善。
239 1
|
3月前
|
安全 C# 数据安全/隐私保护
WPF安全加固全攻略:从数据绑定到网络通信,多维度防范让你的应用固若金汤,抵御各类攻击
【8月更文挑战第31天】安全性是WPF应用程序开发中不可或缺的一部分。本文从技术角度探讨了WPF应用面临的多种安全威胁及防护措施。通过严格验证绑定数据、限制资源加载来源、实施基于角色的权限管理和使用加密技术保障网络通信安全,可有效提升应用安全性,增强用户信任。例如,使用HTML编码防止XSS攻击、检查资源签名确保其可信度、定义安全策略限制文件访问权限,以及采用HTTPS和加密算法保护数据传输。这些措施有助于全面保障WPF应用的安全性。
52 0
|
3月前
|
C# 开发者 Windows
全面指南:WPF无障碍设计从入门到精通——让每一个用户都能无障碍地享受你的应用,从自动化属性到焦点导航的最佳实践
【8月更文挑战第31天】为了确保Windows Presentation Foundation (WPF) 应用程序对所有用户都具备无障碍性,开发者需关注无障碍设计原则。这不仅是法律要求,更是社会责任,旨在让技术更人性化,惠及包括视障、听障及行动受限等用户群体。
82 0
|
3月前
|
前端开发 C# 设计模式
“深度剖析WPF开发中的设计模式应用:以MVVM为核心,手把手教你重构代码结构,实现软件工程的最佳实践与高效协作”
【8月更文挑战第31天】设计模式是在软件工程中解决常见问题的成熟方案。在WPF开发中,合理应用如MVC、MVVM及工厂模式等能显著提升代码质量和可维护性。本文通过具体案例,详细解析了这些模式的实际应用,特别是MVVM模式如何通过分离UI逻辑与业务逻辑,实现视图与模型的松耦合,从而优化代码结构并提高开发效率。通过示例代码展示了从模型定义、视图模型管理到视图展示的全过程,帮助读者更好地理解并应用这些模式。
99 0
|
3月前
|
容器 C# Docker
WPF与容器技术的碰撞:手把手教你Docker化WPF应用,实现跨环境一致性的开发与部署
【8月更文挑战第31天】容器技术简化了软件开发、测试和部署流程,尤其对Windows Presentation Foundation(WPF)应用程序而言,利用Docker能显著提升其可移植性和可维护性。本文通过具体示例代码,详细介绍了如何将WPF应用Docker化的过程,包括创建Dockerfile及构建和运行Docker镜像的步骤。借助容器技术,WPF应用能在任何支持Docker的环境下一致运行,极大地提升了开发效率和部署灵活性。
123 0
|
3月前
|
存储 C# 关系型数据库
“云端融合:WPF应用无缝对接Azure与AWS——从Blob存储到RDS数据库,全面解析跨平台云服务集成的最佳实践”
【8月更文挑战第31天】本文探讨了如何将Windows Presentation Foundation(WPF)应用与Microsoft Azure和Amazon Web Services(AWS)两大主流云平台无缝集成。通过具体示例代码展示了如何利用Azure Blob Storage存储非结构化数据、Azure Cosmos DB进行分布式数据库操作;同时介绍了如何借助Amazon S3实现大规模数据存储及通过Amazon RDS简化数据库管理。这不仅提升了WPF应用的可扩展性和可用性,还降低了基础设施成本。
85 0
|
3月前
|
vr&ar C# 图形学
WPF与AR/VR的激情碰撞:解锁Windows Presentation Foundation应用新维度,探索增强现实与虚拟现实技术在现代UI设计中的无限可能与实战应用详解
【8月更文挑战第31天】增强现实(AR)与虚拟现实(VR)技术正迅速改变生活和工作方式,在游戏、教育及工业等领域展现出广泛应用前景。本文探讨如何在Windows Presentation Foundation(WPF)环境中实现AR/VR功能,通过具体示例代码展示整合过程。尽管WPF本身不直接支持AR/VR,但借助第三方库如Unity、Vuforia或OpenVR,可实现沉浸式体验。例如,通过Unity和Vuforia在WPF中创建AR应用,或利用OpenVR在WPF中集成VR功能,从而提升用户体验并拓展应用功能边界。
70 0
|
3月前
|
区块链 C# 存储
链动未来:WPF与区块链的创新融合——从智能合约到去中心化应用,全方位解析开发安全可靠DApp的最佳路径
【8月更文挑战第31天】本文以问答形式详细介绍了区块链技术的特点及其在Windows Presentation Foundation(WPF)中的集成方法。通过示例代码展示了如何选择合适的区块链平台、创建智能合约,并在WPF应用中与其交互,实现安全可靠的消息存储和检索功能。希望这能为WPF开发者提供区块链技术应用的参考与灵感。
64 0
|
3月前
|
C# 机器学习/深度学习 搜索推荐
WPF与机器学习的完美邂逅:手把手教你打造一个具有智能推荐功能的现代桌面应用——从理论到实践的全方位指南,让你的应用瞬间变得高大上且智能无比
【8月更文挑战第31天】本文详细介绍如何在Windows Presentation Foundation(WPF)应用中集成机器学习功能,以开发具备智能化特性的桌面应用。通过使用Microsoft的ML.NET框架,本文演示了从安装NuGet包、准备数据集、训练推荐系统模型到最终将模型集成到WPF应用中的全过程。具体示例代码展示了如何基于用户行为数据训练模型,并实现实时推荐功能。这为WPF开发者提供了宝贵的实践指导。
44 0
|
3月前
|
开发者 C# UED
WPF与多媒体:解锁音频视频播放新姿势——从界面设计到代码实践,全方位教你如何在WPF应用中集成流畅的多媒体功能
【8月更文挑战第31天】本文以随笔形式介绍了如何在WPF应用中集成音频和视频播放功能。通过使用MediaElement控件,开发者能轻松创建多媒体应用程序。文章详细展示了从创建WPF项目到设计UI及实现媒体控制逻辑的过程,并提供了完整的示例代码。此外,还介绍了如何添加进度条等额外功能以增强用户体验。希望本文能为WPF开发者提供实用的技术指导与灵感。
147 0