C#之WPF学习之路(1)

目录

WPF的起源

C++的qt和C#的wpf对比

winform 和 wpf有什么区别

安装 Visual Studio2022

创建 HelloWorld 程序

App.xaml与Application类

Application的生命周期

Window窗体的生命周期


WPF的起源

WPF(Windows Presentation Foundation)是一种用于构建Windows应用程序的用户界面框架,由Microsoft于2006年推出。它是.NET Framework 3.0的一部分,为开发人员提供了一种基于XAML(可扩展应用程序标记语言)的声明式编程模型,用于创建丰富、交互式的图形用户界面。

WPF的起源可以追溯到Microsoft对Windows用户界面技术的演进。在之前,Windows应用程序主要使用WinForms(Windows窗体)技术来构建用户界面,但它受到了一些限制,尤其是在创建复杂、高度定制的界面方面。

WPF的出现是为了解决这些问题,并提供更加灵活、强大的界面开发工具。它引入了许多新概念,包括分离界面和逻辑的MVVM(Model-View-ViewModel)模式、强大的样式和模板系统、分辨率无关的布局等。

WPF的起源可以总结为以下几个方面:

  1. XAML的引入: XAML是一种XML(可扩展标记语言),用于定义WPF应用程序的用户界面。它使得开发人员可以将界面和行为分离,从而更好地实现界面设计和开发人员之间的协作。

  2. 更强大的图形渲染能力: WPF引入了DirectX技术,使得开发人员可以利用硬件加速的图形渲染功能来创建更加吸引人的用户界面,包括3D图形和动画等。

  3. 数据绑定和样式模板: WPF提供了强大的数据绑定机制,使得界面和数据模型可以轻松地进行交互。同时,WPF还引入了样式和模板的概念,使得界面的外观和行为可以轻松地进行自定义和重用。

  4. 分辨率无关的布局: WPF采用了一种称为“矢量图形”的方式来定义界面,使得界面可以根据不同的分辨率和大小进行自动缩放和调整,从而实现了分辨率无关的布局。

总的来说,WPF的起源可以追溯到对传统Windows应用程序开发模型的改进和完善,它为开发人员提供了更加灵活、强大的工具和技术,使得他们可以更加轻松地创建出色的用户界面。

C++的qt和C#的wpf对比

Qt (C++):

  • 性能高: Qt基于C++,C++是一种高性能的编程语言,因此Qt应用程序通常具有较好的性能。
  • 效果好: Qt提供了丰富的UI组件和功能,可以创建出漂亮且功能丰富的用户界面。
  • 跨平台: Qt是一个跨平台的框架,可以轻松地在不同的操作系统上进行开发和部署。
  • 开发效率低(C++的锅): C++是一种相对底层的语言,相较于高级语言(如C#、Python)而言,需要更多的代码量和更多的开发时间。因此,使用C++开发的Qt应用程序可能会导致开发效率较低。

WPF (C#):

  • 性能适中: WPF应用程序的性能通常是中等水平,受到.NET运行时的影响,但对于大多数常见的应用场景而言,性能是足够的。
  • 效果好: WPF提供了强大的样式和模板系统,开发人员可以创建出色的用户界面。
  • 不跨平台: WPF是Windows平台的专用框架,只能在Windows操作系统上运行,无法在其他操作系统上部署。
  • 开发效率中等: C#是一种高级语言,通常具有较高的开发效率。同时,WPF提供了XAML等工具,进一步提高了开发效率。
  • 占内存: WPF应用程序通常会占用较多的内存,特别是在加载大型界面或使用复杂样式时,这可能会影响一些低端设备的性能。

总的来说,Qt和WPF各有其适用场景。Qt适用于对性能要求较高,需要跨平台支持,并且愿意为开发效率付出一些代价的场景。而WPF适用于在Windows平台上进行开发,并且对开发效率有一定要求的场景。

winform 和 wpf有什么区别

c#有两种方式写桌面应用程序:WPF、winform。我们来看看它们有什么不同。

技术架构:

  • WinForms使用的是传统的窗体和控件模型,控件属性和行为直接在C#代码中实现。
  • WPF采用了XAML(可扩展应用程序标记语言)作为UI设计语言,控件属性和布局可以在XAML中声明。

控件属性设置:

  • 在WinForms中,控件的属性通常是在C#代码中直接设置的,需要编写大量的代码来实现控件的定制和布局。
  • 在WPF中,控件的属性可以通过XAML声明,这使得界面设计和逻辑分离更为清晰,同时可以利用数据绑定等功能实现更灵活的界面。

控件修改复杂性:

  • WinForms在修改和定制控件时,通常需要编写大量的代码,因此可能会比较复杂。
  • WPF通过XAML和数据绑定等技术,使得对控件的修改和定制变得更加简单和灵活。

入门难易程度:

  • WinForms相对于WPF来说,入门门槛较低,因为它更加直接、简单,适合初学者快速上手。
  • WPF入门相对较难,因为需要掌握XAML语言和一些复杂的概念,但一旦熟悉了相关技术,可以带来更大的灵活性和效率。

所以winform有点过时了,咱们要无脑冲WPF。

安装 Visual Studio2022

正所谓“工善其事 必先利其器”,接下来我们来安装一下c#的开发工具。

Visual Studio 2022是微软推出的一款集成开发环境(IDE),用于开发各种类型的应用程序,包括桌面应用、Web应用、移动应用、云服务等。它是Visual Studio系列的最新版本,提供了一系列新功能和改进,旨在提高开发人员的生产力和体验。

下载VS2022的官方网址:Visual Studio 2022 IDE - 适用于软件开发人员的编程工具

目前VS2022提供了3个版本,分别是:

  • Community社区版,对学生、开源贡献者和个人免费
  • Professional,非常适合小型团队的专业 IDE
  • Enterprise,可扩缩的端到端解决方案,适用于任何规模的团队

仅学习使用的话,Community社区版就足够了。

第一步,点击上方链接,选择合适的版本,下载VisualStudioSetup.exe并运行。

第二步,接下来,勾选下图的选项,等待Visual Studio Installer 为我们下载安装程序。

第三步,安装完后,无脑操作就OK了

创建 HelloWorld 程序

在学习一门新语言时,我们以一个HelloWorld程序来创建第一个WPF应用程序

第一步,启动VS2022软件后,点击创建新项目。

第二步,在搜索框搜索wpf,然选择第一个wpf应用程序。

第三步,修改项目名称和位置,然后下一步。

第四步, 默认就行,直接创建

第五步,修改MainWindow.xaml代码

<Window x:Class="WpfApp2.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:local="clr-namespace:WpfApp2"mc:Ignorable="d"Title="学习之路" Height="450" Width="800"><Grid><Button Content="学习WPF" Margin="0,193,382,0" Click="Button_Click" Height="19" VerticalAlignment="Top" HorizontalAlignment="Right" Width="54"/></Grid>
</Window>

第六步,修改MainWindow.xaml.cs代码

using System.Windows;namespace WpfApp2
{/// <summary>/// Interaction logic for MainWindow.xaml/// </summary>public partial class MainWindow : Window{public MainWindow(){InitializeComponent();}private void Button_Click(object sender, RoutedEventArgs e){MessageBox.Show("Hello, World!");}}
}

这两段代码实现了点击按钮后弹出 "Hello, World!" 的功能。

App.xaml与Application类

在WPF中,App.xaml和Application类都是用于管理应用程序级别的资源和事件的重要组件,但它们具有不同的功能和作用。

App.xaml:

  • App.xaml是一个XAML文件,通常位于WPF应用程序的根目录中。它定义了应用程序级别的资源、样式、主题和全局事件处理程序。
  • 在App.xaml中,您可以定义应用程序级别的资源,例如字体、颜色、样式、数据模板等。这些资源可以在整个应用程序中被所有窗口和用户控件共享。
  • 此外,App.xaml还包含了应用程序启动时的事件处理程序,例如Application_Startup事件,您可以在这里执行一些初始化操作。

Application类:

  • Application类是WPF应用程序的主要入口点,它继承自System.Windows.Application类。
  • Application类是一个用于管理应用程序的单例对象,它负责初始化应用程序、处理应用程序级别的事件和状态,以及调度窗口和页面的生命周期。
  • 通过Application类,您可以访问应用程序级别的资源、主题、设置和状态。它还提供了一些事件,例如Startup、Exit、SessionEnding等,您可以在这些事件中执行应用程序级别的逻辑。
  • 您可以在App.xaml.cs文件中的App类中重写Application类的方法,例如OnStartup、OnExit等,以自定义应用程序的行为和事件处理。

总的来说,App.xaml和Application类都是WPF应用程序中管理应用程序级别资源和事件的重要组件。App.xaml用于定义应用程序级别的资源和样式,而Application类用于管理应用程序的初始化、事件处理和状态

Application的生命周期

在WPF中,Application类的生命周期包括以下事件和阶段:

  • OnStartup:OnStartup事件在应用程序启动时触发。在这个事件中,您可以进行应用程序的初始化工作,例如创建主窗口、加载资源、设置全局样式等。
  • OnActivated:OnActivated事件在应用程序被激活时触发,即当应用程序从非激活状态切换到激活状态时触发。例如,当用户从其他应用程序切换回到您的应用程序时,OnActivated事件会被触发。
  • OnDeactivated:OnDeactivated事件在应用程序从激活状态切换到非激活状态时触发。例如,当用户将您的应用程序最小化、切换到其他应用程序或者系统弹出对话框时,OnDeactivated事件会被触发。
  • OnExit:OnExit事件在应用程序退出时触发。在这个事件中,您可以进行一些清理工作,保存用户数据或者释放资源。

这只是Application的生命周期,事实上,由于Application总是会启动一个界面(窗体),而窗体也会有自己的生命周期。

Window窗体的生命周期

在WPF中,Window窗体的生命周期包括以下主要阶段和事件:

  1. 构造函数(Constructor):当窗口对象被实例化时,构造函数会被调用。您可以在构造函数中进行一些初始化工作,但请注意,此时窗口对象可能还没有完全初始化完成。
  2. Loaded事件:Loaded事件在窗口对象被加载到视觉树并准备好进行交互时触发。在Loaded事件中,您可以执行一些与UI元素相关的初始化操作,例如数据绑定、控件的属性设置等。
  3. Activated和Deactivated事件:Activated事件在窗口被激活(成为焦点)时触发,而Deactivated事件在窗口失去焦点时触发。这些事件通常在窗口的交互过程中使用,您可以根据窗口的激活状态执行相应的操作。
  4. ContentRendered事件:ContentRendered事件在窗口的内容被渲染并呈现到屏幕上后触发。在ContentRendered事件中,您可以执行一些需要等待窗口完全呈现后才能执行的操作。
  5. Closing事件:Closing事件在窗口即将关闭之前触发。在Closing事件中,您可以询问用户是否保存修改、取消关闭操作或者执行一些清理工作。
  6. Closed事件:Closed事件在窗口已经关闭后触发。在Closed事件中,您可以执行一些清理工作、释放资源等。
  7. Disposed事件:Disposed事件在窗口对象被销毁(释放)时触发。在Disposed事件中,您可以执行一些最终的清理工作,例如取消订阅事件、释放非托管资源等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2807560.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

基于SpringBoot的停车场管理系统

基于SpringBootVue的停车场管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatis工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 前台首页 停车位 个人中心 管理员界面 摘要 摘要&#xff1a;随着城市化进程的…

ubantu设置mysql开机启动

阅读本文之前请参阅----MySQL 数据库安装教程详解&#xff08;linux系统和windows系统&#xff09; 在Ubuntu系统中设置MySQL开机启动&#xff0c;通常有以下几种方法&#xff1a; 1. **使用systemctl命令**&#xff1a; Ubuntu 16.04及更高版本使用systemd作为…

图像压缩感知的MATLAB实现(OMP)

前面实现了 压缩感知的图像仿真&#xff08;MATLAB源代码&#xff09; 效果还不错&#xff0c;缺点是速度慢如牛。 下面我们采用OMP对其进行优化&#xff0c;提升速度。具体代码如下&#xff1a; 仿真 构建了一个MATLAB文件&#xff0c;所有代码都在一个源文件里面&#xf…

【鸿蒙开发】第十四章 Stage模型应用组件-任务Mission

1 任务(Mission)管理场景 任务&#xff08;Mission&#xff09;管理相关的基本概念如下&#xff1a; AbilityRecord&#xff1a;系统服务侧管理一个UIAbility实例的最小单元&#xff0c;对应一个应用侧的UIAbility组件实例。系统服务侧管理UIAbility实例数量上限为512个。 Mi…

#FPGA(IRDA)

1.IDE:Quartus II 2.设备&#xff1a;Cyclone II EP2C8Q208C8N 3.实验&#xff1a;IRDA&#xff08;仿真接收一个来自0x57地址的数据0x22 (十进制34)&#xff09; 4.时序图&#xff1a; 5.步骤 6.代码&#xff1a; irda_receive.v module irda_receive ( input wire…

Llama2模型的优化版本:Llama-2-Onnx

Llama2模型的优化版本&#xff1a;Llama-2-Onnx。 Llama-2-Onnx是Llama2模型的优化版本。Llama2模型由一堆解码器层组成。每个解码器层&#xff08;或变换器块&#xff09;由一个自注意层和一个前馈多层感知器构成。与经典的变换器相比&#xff0c;Llama模型在前馈层中使用了不…

MySQL sql注意点

本文列取了常用但是容易遗漏的一些知识点。另外关键词一般大写&#xff0c;为了便于阅读所以很多小写。也为了给自己查缺补漏。 distinct&#xff08;去重&#xff09; 也许你经常对单个字段去重&#xff0c;并且知道不建议用distinct&#xff0c;而是group by&#xff0c;因为…

FL Studio21中文版功能、特点、使用场景及适用人群详解

一、功能介绍 FL Studio21中文版作为一款功能全面的数字音频工作站&#xff08;DAW&#xff09;&#xff0c;提供了从音乐创作到后期混音所需的完整工具集。以下是其主要功能&#xff1a; FL Studio 21.2.3 Win-安装包下载如下: https://wm.makeding.com/iclk/?zoneid55981 …

Vue3_基础使用_3_Hooks模块化

今天主要学习的是hooks, vue3的使用比vue2方便很多了&#xff0c;但是呢各个功能块的逻辑有时候还是会缠绕在一起&#xff0c;这个时候使用hooks进行模块化管理开发&#xff0c;说白了就是将每个单独的业务放到自己的.ts中去写&#xff0c;以后修改就找到这个ts 不用到处去翻…

VsCode的leetcode插件无法登录

前提 想使用VsCode的leetcode插件进行刷题&#xff0c;然后按照网上的教程进行安装下载&#xff0c;但是到了登录这一步&#xff0c;死活也登录不了&#xff0c;然后查看log一直报的错误是invalid password。 解决方法 首先确定在插件中设置的站点是Leetcode中国&#xff0c…

Stable Diffusion 绘画入门教程(webui)-ControlNet(Tile/Blur)

上篇文章介绍了y语义分割Seg&#xff0c;这篇文章介绍下Tile/Blur&#xff08;增加/减少细节&#xff09; Tile用于增加图片细节&#xff0c;一般用于高清修复&#xff0c;Blur用于减少图片细节&#xff08;图片模糊&#xff09;&#xff0c;如下图&#xff0c;用Tile做修复&a…

apidoc接口文档的自动更新与发布

文章目录 一、概述二、环境准备三、接口文档生成1. 下载源码2. 初始化3.执行 四、文档发布五&#xff0c;配置定时运行六&#xff0c;docker运行 一、概述 最近忙于某开源项目的接口文档整理&#xff0c;采用了apidoc来整理生成接口文档。 apidoc是一个可以将源代码中的注释直…

说说设备像素、css像素、设备独立像素、dpr、ppi 之间的区别

文章目录 一、背景二、介绍CSS像素设备像素设备独立像素dprppi 三、总结参考文献 一、背景 在css中我们通常使用px作为单位&#xff0c;在PC浏览器中css的1个像素都是对应着电脑屏幕的1个物理像素 这会造成一种错觉&#xff0c;我们会认为css中的像素就是设备的物理像素 但实…

谷歌连发 Gemini1.5、Gemma两种大模型,Groq让模型输出速度快18倍

本周&#xff0c;我们观察到以下AI领域的新动向和新趋势&#xff1a; 1.谷歌连发Gemini1.5和Gemma两种大模型&#xff0c; 其中Gemini1.5采用MoE架构&#xff0c;并拥有100万token上下文长度&#xff0c;相比Gemini 1.0性能大幅提升。Gemma是谷歌新推出的开源模型&#xff0c;…

精品基于SpringBoot+Vue的常规应急物资管理系统

《[含文档PPT源码等]精品基于SpringBootVue的常规应急物资管理系统[包运行成功]》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; Java——涉及技术&#xff1a; 前端使用技术&#xff…

手写redux和applyMiddleware中间件react示例

目录 一 核心代码 1.reducer 2.store.js 二 关于context API的使用 1. MyContext 2. createContext 3. ContextProvider 4. connect 三 组件验证效果 1. Todo 2. TodoList 3.TodoItem 4.TodoInput 5. App组件引入Todo组件 一 核心代码 1.reducer // 新增列表数…

企业如何定制化“可靠的”系统,实现数字化转型?

二十大提出高质量发展是首要任务&#xff0c;为顺应数字经济时代的发展&#xff0c;数字化转型正不断赋能各行各业。越来越多的企业管理者也意识到数字化转型是帮助企业提升内部运营效率&#xff0c;提升业务开展效率&#xff0c;减低企业成本的有效手段。 那么如何推动企业数字…

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具

daydayEXP: 支持自定义Poc文件的图形化漏洞利用工具 基于java fx写的一款支持加载自定义poc文件的、可扩展的的图形化渗透测试框架。支持批量漏洞扫描、漏洞利用、结果导出等功能。 使用 经过测试,项目可在jdk8环境下正常使用。jdk11因为缺少一些必要的组件,所以jdk11版本工…

《凤凰架构》 -分布式事务章节 读书笔记

分布式事务严谨的定义&#xff1a;分布式环境下的事务处理机制 CAP定理&#xff1a;在一个分布式系统中&#xff0c;涉及共享数据问题时&#xff0c;以下三个特性最多只能同时满足两个 一致性&#xff1a;代表数据在任何时刻、任何分布式节点中看到的都是符合预期的&#xff0…

嵌入式按键处理驱动(easy_button)

简介 在嵌入式裸机开发中&#xff0c;经常有按键的管理需求&#xff0c;GitHub上已经有蛮多成熟的按键驱动了&#xff0c;但是由于这样那样的问题&#xff0c;最终还是自己实现了一套。本项目地址&#xff1a;bobwenstudy/easy_button (github.com)。 项目开发过程中参考了如…