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开发)

  本文来自Manon_Loki的博客,原文地址:http://www.cnblogs.com/ShadowLoki/archive/2012/08/08/2627986.html

 

C# WPF MVVM开发框架Caliburn.Micro快速搭建③ WPF MVVM开发框架Caliburn.Micro快速搭建 阅读详情

相关推荐

WPF机器视觉框架实训手册

摘要 本手册系统介绍了WPF机器视觉框架实训课程的内容与实施方法。课程采用理论与实践相结合的方式,通过构建基于WPF和Halcon的插件化机器视觉开发框架,培养学员的机器视觉软件开发能力。手册详细讲解了项目架构设计(包括主程序层、插件层和库文件层的分层架构)、技术栈(WPF、Halcon、DevExpress等)、环境搭建步骤,以及解决方案的项目结构分析。实训强调工程化思想,通过任务驱动的方式帮助学员掌握插件化架构设计、模块化编程和Halcon视觉算法应用等核心技能,为工业机器视觉应用开发打下坚实基础。

AiStudio 943

一、WPF架构

WPF架构简介

qq_43050689的博客 4041

《深入浅出WPF》学习笔记

WPF是什么? WPF是Windows Presentation Foundation的简称,是用来专门编写程序表示层的技术 1.XAML概览 1.1XAML是什么 XAML(Extensible Application Markup Language):可扩展应用程序标记语言,类似于HTML+CSS+JavaScript的组合 XAML是WPF技术中专门用来设计UI的语言 XAML是...

贵有恒,何必三更眠五更起;最无益,莫过一日曝十日寒 4870

WPF快速搭建MVVM框架

WPFDemo项目结构: Views: MainWindow.xaml <Window x:Class="WPFDemo.Views.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://sche.

Summer_Jack的博客 2835

WPF理论概述与模式框架(三层架构、MVC与MVVM)

本节我们简单介绍WPF的核心作用,并据此谈论三层架构,进而引申出WPF设计中常用的MVC和MVVM模式,最后再据此总结WPF的开发特性和前景优势。开发者需要明确认识WPF技术的使用目的,并熟知三层架构,明确MVC和MVVM模式的组成和逻辑。

GhostKINGC学长的笔记本 6758

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel

WPF基础 | WPF 布局系统深度剖析:从 Grid 到 StackPanel, 在 WPF 的布局体系中,Grid 和 StackPanel 堪称两颗耀眼的明星,它们各自拥有独特的布局特性,适用于截然不同的场景,为开发者提供了灵活多变的布局选择。Grid 以其类似表格的网格结构,能够精准地对界面进行行列划分,轻松实现复杂的布局架构,无论是多模块的信息展示,还是不同区域的精细排版,Grid 都能游刃有余地应对;而 StackPanel 则专注于简单高效的线性排列,将子元素按照水平或垂直方向依次堆……

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 2683

WPF框架剖析,从头开始自己写WPF框架

首先,在这里我要说明的是:这里的例子,都是通过控制台程序来创建WPF应用,而非使用现成的WPF模版。因为WPF模版封装了创建WPF应用所需要的各种基本元素,并不利于我们学习。   创建一个WPF需要引用的最基本的DLL   1、PersentationCore WPF的核心类库   2、PersentationFramework 封装了与WPF控件相关类型的类库   3、S

iilegend的博客 7345

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础|初探WPF:理解其核心架构与开发环境搭建,本文旨在深入探讨WindowsPresentationFoundation(WPF),首先介绍WPF的基本概念及其在微软技术生态中的地位,随后详细剖析其核心架构,包括核心组件、布局系统、数据绑定机制、事件处理机制等方面。接着阐述WPF开发环境的搭建过程,从安装必要软件到创建第一个简单的WPF应用程序都进行了细致说明。通过对WPF核心架构的理解和开发环境搭建的掌握,为进一步深入学习和应用WPF技术奠定坚实基础,帮助开……

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 4922

WPF UI 框架深度解析:主流框架对比与实战选型

本文深度解析了WPF UI框架的选型与应用,对比了MaterialDesignInXamlToolkit、HandyControl、MahApps.Metro、WPF UI和Panuon.WPF.UI五大主流框架的核心特点、适用场景与实战表现。文章提供了清晰的四步选型指南,帮助开发者根据设计风格、功能需求、团队技术栈和性能要求,选择最适合项目的UI框架,从而提升开发效率与应用视觉体验。

h9j8k7l6m5n的博客 1136

【2026年深度剖析】C#上位机UI框架选型:WinForm与WPF的终极对决,工控人再也不纠结

2026年了,做上位机到底用WinForm还是WPF?打开各类技术社区,总能看到两种极端的声音:一部分人说「WinForm早就过时了,又丑又难用,现在做上位机必选WPF」;另一部分人反驳「WPF学习成本高、坑多、资源占用大,工控机跑着卡,工业场景还是WinForm最香」。甚至有不少刚入行的工控开发者,跟风用WPF做纯数据采集的上位机,最后项目延期、BUG频发;也有老工程师死守WinForm,面对需要做可视化组态、工业大屏的项目,只能束手无策。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1537

WPF MVVM框架实战指南与项目架构

WPF(Windows Presentation Foundation)是微软推出的一个用于构建Windows客户端应用程序的用户界面框架,属于.NET Framework的一部分。它提供了一种全新的方式来呈现用户界面,与传统的WinForms应用相比,WPF具有更强的图形和视觉表现力。本章将概述WPF框架的核心概念及其在现代桌面应用开发中的地位。视图(View)是用户看到并与之交互的界面。在WPF应用中,视图通常是由XAML编写的,它定义了用户界面的布局、控件以及样式。

weixin_42599908的博客 1233

WPF学习笔记(2)运行剖析

WPF运行流程5个步骤的剖析Application类详解Window类继承各层级父类的部分属性、方法和事件介绍。

lzt1027的博客 1183

WPF UI框架HandyControl完整指南与实战

WPF(Windows Presentation Foundation)是一种基于.NET框架的用户界面技术,它允许开发者通过声明式的XAML(可扩展应用程序标记语言)代码来构建丰富的交互式桌面应用程序。不同于传统的Windows Forms,WPF提供了包括但不限于2D/3D图形、动画、视频播放、音频播放在内的多种媒体支持,并集成了强大的数据绑定功能。这使得WPF不仅仅是一个UI库,更是一种全新的应用程序开发模式。

weixin_28895791的博客 1211

剖析WPF模板机制的内部实现

1.是所有模板类的基类,类有一个类型的属性,将使用这个属性的模板对象来生成,并将这个visual tree赋值给自己的属性,从而在两个Visual类对象之间建立起;2.的属性是虚属性,子类可以通过覆写这个属性来自定义模板。只有四个类ControlPage覆写了这个属性,这意味着只有这4个类及其子类控件才能应用自定义的模板,它们也是WPF模板机制的实现基础;3.和。WPF中这些模板类定义的变量很多,它们的内部实现也不尽相同,不过万变不离其宗,所有模板类最终都要把自己传递到。

kalvin_y_liu的博客 825

简单的图书管理系统---SpringBoot+mysql通过前后端分离实现增删查改

SpringBoot+mysql通过前后端分离实现增删查改 上篇文章介绍了如何写后端接口 SpringBoot连接MySQL获取数据写后端接口 这篇文章,我们就介绍一下怎么写前端 点击修改跳出修改界面,点击添加书籍跳出添加书籍界面 点击删除,直接删除一行数据 其他的也没什么解释了,直接上代码(看不懂的可以私聊我哟) <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>

爱笑的博客 2014

保姆级教程:用Python spatialdata框架搞定10x Xenium空间转录组数据(从下机到高级分析)

本教程详细介绍了如何使用Python spatialdata框架处理10x Xenium空间转录组数据,从数据获取到高级分析的全流程。涵盖环境配置、数据读取、质量控制、降维聚类、细胞注释及空间共定位分析等关键步骤,特别适合生物信息学研究者快速掌握Xenium数据分析技术。

weixin_30300225的博客 480

深入剖析WPF数据验证

1、WPF包含的验证方式 方式 父类 对应接口 处理方式 简便写法 默认值 ExceptionValidationRule ValidationRule 无 检查在更新数据源(Source)时抛出的异常 ...

岁月无情 2077

从零到一:RJ71EN71 ModbusTCP配置的避坑指南与实战技巧

本文详细解析三菱RJ71EN71模块的ModbusTCP配置全流程,涵盖GX Works3参数设置、地址映射、通信调试等核心环节。针对工业环境中常见的IP冲突、软元件分配错误、通信超时等高频问题提供实战解决方案,帮助工程师快速构建高可靠性通信网络,避免项目延期风险。

zzz56的博客 331

探索WPF开发的新境界:MVVMLight框架实战指南

探索WPF开发的新境界:MVVMLight框架实战指南 去发现同类优质开源项目:https://gitcode.com/ 在这个追求高效、模块化软件开发的时代,WPF(Windows Presentation Foundation)作为.NET平台上强大的UI框架,携手MVVMLight,正成为开发桌面应用的一股不可忽视的力量。今天,我们为您揭秘一个精心打造的WPF MVVMLight框架Demo...

gitblog_09732的博客 888

Windows下MMdetection3D保姆级安装指南(含CUDA和PyTorch版本避坑)

本文提供Windows平台下MMdetection3D的完整安装指南,重点解决CUDA与PyTorch版本匹配问题。从环境准备到关键组件安装,详细介绍了CUDA Toolkit选择策略、PyTorch精准安装步骤,以及MM系列组件的安装顺序和常见错误解决方案,帮助用户顺利完成3D目标检测环境的配置。

weixin_42628941的博客 490

Faster Planner——Kinodynamic Astar详解

实际成本和启发式成本 实际成本 Actual Cost   每条轨迹的真实代价函数定义如下: J(T)=∫0T∥u(t)∥2dt+ρT \mathcal{J}(T)=\int_{0}^{T}\|\mathbf{u}(t)\|^{2} d t+\rho T J(T)=∫0T​∥u(t)∥2dt+ρT 离散形式下: 启发成本 Heuristic Cost pμ∗(t)=16αμt3+12βμt2+vμc+pμc=pμc+vμc+T2∗((2∗vμc−2∗vμg)/(2∗T)−(6∗pμc−6∗pμg+6∗T∗v

漫长IT路 4831

WPF 与 C# 开发深度剖析

方法是一段具有特定功能的代码块,可以接收参数并返回值。WPF 是微软为 Windows 平台开发的下一代用户界面框架,它引入了全新的图形渲染引擎,支持硬件加速,能够创建出高质量的 2D 和 3D 图形界面。WPF 使用 XAML(可扩展应用程序标记语言)来描述用户界面,使得界面设计和代码逻辑分离,提高了开发效率和可维护性。</Style></Border></Setter></Style>MessageBox.Show("命令已执行");

m0_44975814的博客 2282

secureCRT 破解方法

3、输入注册信息打开keygen.exe,点击path,选择SecureCRT的安装目录(例如D:\VanDykeSoftware\Clients)的securecrt.exe打开,继续下一步打开LicenseHelper.exe,如下。1、注册SecureCRT9.1打开keygen.exe,出现以下问题(没有关掉安全防护,一双击打开,Windows会自动识别keygen.exe为bingdu并删除)打开桌面SecureCRT,此界面不输入内容,直接点击下一步。2、存储配置文件夹(可以默认安装)

逆水行舟 1万+

WinForms 与 WPF:差异剖析与场景应用指南

摘要: 本文对比了Windows桌面开发的两种主要框架WinForms与WPF的核心差异。WinForms基于传统Windows控件,开发简单但布局和图形能力有限,适合快速开发简单应用或兼容旧系统;WPF采用XAML和DirectX渲染,支持复杂布局、数据绑定及高级视觉效果,适用于现代UI、数据可视化和跨平台场景。两者在性能、开发效率及适用场景上各有侧重:WinForms启动轻量但扩展性弱,WPF学习曲线陡峭但功能强大。开发者需根据项目需求(如界面复杂度、性能要求、团队技术储备)选择合适框架。

分享知识,拥抱变化 1377

深入剖析Zynq AMP模式下CPU1中断响应机制:从原理到创新实践

在异构计算领域,Zynq-7000系列SoC的AMP(Asymmetric Multiprocessing)模式堪称多核编程的瑞士军刀。独立运行环境:CPU0运行Linux,CPU1运行FreeRTOS或裸机程序硬件资源独占:CPU0管理DDR,CPU1使用OCM(片上内存)中断隔离:默认所有中断路由到CPU0这种架构非常适合需要实时响应的工业控制系统——比如用CPU0处理网络通信,CPU1负责电机控制。AMP模式下中断路由的底层原理多维度性能优化技巧工业级可靠性的实现方案。

QQ_778132974的博客 490

工业产线瑕疵检测:基于 YOLO 的自动化质检系统实战

从工业瑕疵数据集构建到模型训练,从桌面检测界面到产线适用性优化,本文覆盖了一套工业质检系统的完整路线。这个场景的核心评价指标不是最高精度,而是在保证 recall ≥ 0.95 的前提下尽可能压低 false positive——因为漏检的直接成本(客户投诉、质量事故)远高于误报的成本(人工复检)。部署时先设一个偏低的置信度阈值确保覆盖,再通过持续收集人工复检数据来逐步调优。

m0_71589036的博客 65
上一篇: java对象占内存大小
下一篇: 【图解】Ogre1.8 SampleBrowser流程全面分析
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值