WPF初学总结2

Avalonia 初学笔记(2):简单了解与WPF的区别 C# 上位机技术的终点有两个技术,Avalonia和Unity。Godot目前3D还是太拉了,MAUI目前也只是玩具。Avalonia是跨平台版本的WPF,而Unity是实现3D预览效果的选择。Avalonia算是上位机的终点了,我目前打算学习Avalonia+ReactiveUIB站_十月的寒流:Avalonia中的那些让WPF开发者相见恨晚的特性 阅读详情

一、WPF也有一些类型,和.Net类型对比如下:

.NET 常见类型有: Byte、Decimal、Double、Int16、Int32、Int64、Single
WPF 类型有: Color、Point、Point3D、Quaternion、Rect、Rotation3D、Size、Thickness、Vector、Vector3D

 

 二、WPF中的图形和图像

分为三类:

(1)从无到有绘制一个图形的外形(也就是建立三角形顶点),也就是建立图形的纯几何元素的类。用于这个功能的类都继承于抽象基类Shape类。以后出现Shape子类的地方就相当于建立了一系列三角形顶点,也就是建立了一个形状(把Button也看成一个形状,就好像建立了一个Button一样)。

(2)对已存在的图形的外形进行变换(看成对三角形顶点的位置坐标进行修改)的类。用于这个的类就两个:Transform(抽象基类)和BitmapEffect类(抽象基类)

(3)描述图形内部的显示效果(看成像素着色器里的纹理等)或表面效果的类,可以把刷子就看成是一张图片纹理(我怀疑底层就是一个纹理)。就是一个Brush(抽象基类)。

(4)其实前面三个就完全描述了图形图像的建立和显示以及变换了。但WPF还提供了DrawingXXX类,这个类用来包装一个内存结构来作为Image或Brush(相当于Direct3D里面的渲染到纹理)。这样做的好处是,比如可以把一个内存结构描述的某个图形图像(在内存里形成的纹理图)看成一个画刷,这样画刷就更灵活了。说白了就把Brush看成一张纹理图,DrwingBrush是一张在内存里的纹理图,而不是存在硬盘上的。

 

下面对上面三四种进行详细的解释:

(1)从无到有绘制一个图形的外形(外形Shape)

WPF 提供了六种你可以用在你的UI 中的形状元素,有五个简单形状类和一个叫做Path 的能让你定义任意形状的形状类,形状是元素因此可以直接放入你的UI(就相当于一个Button一样)。

五中基本形状用法(下面左图是代码,右图是运行结果):

剩下的形状类是Path 类,能让你去生成任意的二维形状。你通过创建一个派生自Geometry 类的一些子对象,然后分配这些子对象到形状对象Path的Data 属性来做到这一点。具体如下图:

 注意,各种Geometry类不是设计用于渲染他们本身。就把Geometry的子类对象看成是三角形缓存。

下面一一对Geometry类的各种类型的子类详细解释:

a、简单的几何类(基本几何),这些类的作用就和上面讲的基本五中基本形状类的作用一样,生成规则的图形,可以不做重点记忆,就看成五中基本形状的另一种描述吧。

这些类比较好理解,直接上代码和运行结果:

 b、PathGeometry 类(路径几何),PathGeometry类能让你设定任意的复杂路径、组成线段的组合、弧线,和贝塞尔曲线。

PathGeometry对象的结构有三种类型的对象组成:
   *PathGeometry对象本身包含一个叫做Figures 的属性,是各种PathFigure 对象的一个集合。
   *每个PathFigure 有一个叫做Segments 的属性,是各种路径片段的定义的一个集合。
   *路径片段是实际描述各种位置、弧线和路径的对象。有7 种类型的路径片段,包含LineSegment、ArcSegment和5 种贝塞尔片段的类型。

如下图:

可以看出,PathGeometry下面包含PathFigure们,而PathFigure下面包含Segment们。

以LineSegment(直线片段)和PolyLineSegment(折线片段)举例如下:

c、合并几何图形。

有两种方式你可以用来合并多个Geometry对象:
   *GeometryGroup类可以包含被作为单个对象对待的各种Geometry对象的一个集合。你可使用一个GeometryGroup对象在任何你可以使用单个Geometry对象的地方。
   *CombinedGeometry类获取两个Geometry对象然后合并他们到拥有与那两个单独对象都不相同的路径的一个Geometry对象。

 下面的例子展示了一个带有两个椭圆的GeometryGroup的一个示例。Path 类的Data 属性需要单个指向一个Geometry类的引用,因此我们不能直接放置两个EllipseGeometry对象到Data 属性。为了解决这个问题,你可放置椭圆在一个GeometryGroup中然后指定他到Data属性。

从上图可以看出:一个GeometryGroup 是各种Geometry 对象的一个集合,可以被使用在任何单个Geometry 可以被使用的地方。

不像仅仅是一个Geometry对象的集合的GeometryGroup类,CombinedGeometry类确实得合并两个Geometry对象的部分到一个新的对象(不像任何一个原始对象的一个对象)。

这个例子只是异或的结果,还有其他的样式,全部列在如下的图中:

d、Path 标记语法

从前面的例子中,我看到了一个PathGeometry对象中的各种PathFigure的标记可以是相当大规模的,甚至去描述简单路径时。为了改进这点,WPF 提供了路径标记语法,能让你明显得缩短标记。为了使用路径标记语法,你指定一个字符串到PathGeometry的Figures属性。这个字符串包含用于描述路径的速记法。

有三种类型的命令。
        — 移动命令:这种命令设置了图像的起点。这个命令可以是大写字母M 或小写字母m。
        — 绘画命令:根据要绘画的路径有许多不同的绘画命令。
        — 闭合命令:这个命令是一个可选的并且是一个大些字母Z 或小写字母z。

看下面的例子:

上图中,第一个命令是一个大写字母M。这是移动命令,他,在这个例子中,设置了图像的起始点为位置10,10。事实上命令是大写字母的意味着位置是一个绝对位置。而一个小写子母m,相对的,意味着”相对于前一个位置”。第二个命令是大写字母L。这是“划线到”命令,它意味着接着命令的各个坐标位置序列是路径中的各点。就像使用M 命令,大写字母意味着点设定了绝对位置,小写字母意味个相对于前一个点的各个点。

另一个例子,下面的代码使用了路径标记语法来描述两个多段路径:

 

(2)对已存在的图形的外形进行变换

Transform能让你以一种特定的方式修改一个元素的外观。有六个派生自基类Transform 类的类,并且他们被分为下面的三个类别。

        a、有四个预定义的Transform:RotateTransform、ScaleTransform、SkewTransform,和TranslateTransform。这些分别能让你旋转一个元素、改变其尺寸、倾斜其角度和移动他。
   b、通用的Transform类,叫做MatrixTransform,能让你单独得操作一个变形的所有参数。那四个预定义类就是MatrixTransform类的各种特殊化版本。
   c、TransformGroup是一个各种Transform的集合。TransformGroup派生自Transform基类,因此他可以被使用在任何其他的Transform 对象被使用的地方。当一个
TransformGroup 应用到一个元素,集合中的每个Transform 就被应用到了那个元素。

下图展示了这些类和类别。

 

你可以通过指定他到元素的两个Transform 属性之一( LayoutTransform 或RenderTransform)来应用一个Transform到一个元素。如果你指定他到LayoutTransform属性,变形就会在WPF 计算元素的布局时进行。如果你指定他到RenderTransform元素,WPF 延迟应用这个变形直到其显示的渲染步骤。

举例:

下面的左图是上面代码(使用LayoutTransform)的运行结果,右图是上面代码改为RenderTransform时的运行结果。

 

 (3)描述图形内部的显示效果(看成像素着色器里的纹理)或表面效果的类(刷子)

 a、有三大类别的刷子:

这三大类别(SolidColorBrush、GradientBrush 和TileBrush,继承关系如下图,白色虚框代表抽象类。

b、下面详细讲解下LinearGradientBrush画刷,也是最常用的画刷。

下面的标记指定了描绘了一个按钮的Background的一个LinearGradientBursh。这个LinearGradientBursh五个GradientStop,包括了起点和终点。

运行结果和分析如下图:

 

c、关于画刷的传播方式的SpreadMethod无非就是解决开始点和结束点两端之外的颜色问题,这里就不详述了。

d、画刷常用在哪些地方,即作为哪些属性的值,以及附加的一些属性。

    *Stroke 包含了指向了一个用于描绘Geometry的路径的Brush 对象的一个引用。
 *Fill 包含了指向一个用于描绘对象内部的Brush 的一个引用。
 *IsClosed 属性是一个bool 值设定了是否自动添加一个从路径的终点到起点的线。
 *IsFilled 属性是一个bool 值设定了是否使用Fill 刷子描绘路径的内部。

其它的关于两个或多个图像重叠区域的问题涉及FillRule属性,较为复杂,暂时先不赘述。

 

 

WPF MaterialDesign 初学项目实战(2)首页导航栏样式 PS:这里使用了Lambda表达式,类似于ES6的语法,如果学过web前端应该比较熟悉。选择按钮的时候也有代码提示,点击代码会跳转到Github的库里面,可以看到原始的代码。这里的样式特别多,而且有没实际展示的效果,所以推荐还是直接看按钮示例来选择按钮样式。在WPF里面添加文件夹,命名随意,我习惯用static。使用Image.Clip进行图片裁剪。选中拖动的窗口,添加x:name。在键入首字母时也会自动提示。将添加的图片设置为资源。github仓库样式。 阅读详情

相关推荐

WPF MaterialDesign 初学项目实战(6):设计首页(2),设置样式触发器。已完结

我现在基础掌握的差不多了,之后的项目代码只挑选难点进行描述,简单重复的地方我就跳过了。如果想要源码的可以去B站视频上面去找源码。我想到WPF的环境搭建比较复杂,我之后的博客会把所有的环境写下来。数据绑定使用频率较高,之后不再详细描述代码。动态生成列表,其实都是老一套方法了。在ViewIndex里面引用。示例代码,鼠标滑动边框发光。Binding对应属性。声明List

qq_44695769的博客 1439

2018-11-26-WPF-通过-DrawingContext-DrawImage-绘制图片

title author date CreateTime categories WPF 通过 DrawingContext DrawImage 绘制图片 lindexi 2018-11-26 16:13:14 +0800 2018-11-26 15:4:7 +0800 WPF 本...

lindexi 2284

[WPF] 初学WPF——DispatcherTimer简单的时钟

这两天刚刚开始学习WPF,刚刚接触,还有点摸不着头脑,今天早上刚刚做了我的第一个WPF的代码练习,也是从别的网站上看到的例子,自己实践了一下下,在这里和大家交流一下。因为我是初学者,所以把如何创建WPS项目先记录一下:1、启动Microsoft Visual Studio 2008——File——New——Project2、选择Visual C#下的Windows,然后选择WPF Br

有了大树的幸福树懒~~~的专栏 5478

WPF drawingContext.DrawImage 遇到的问题

起因 由于插入图片的需要,所以继承 Stroke 写了一个 ImageStroke,但是发现在使用默认的 Transform 来实现旋转操作会达不到预期的效果(没有旋转而是发生了预期外的形变),故只能找别的办法。 一开始的思路 首先保存一个图片的 Rect 对象,保证这个对象不会被 Transform 旋转。然后再保存旋转的角度再 DrawCore 里面调用 drawingContext.Push...

Thxzzzzz的博客 1446

WPF从初学者到专家:实战项目经验分享与总结

WPF从初学者到专家:实战项目经验分享与总结,Windows Presentation Foundation(WPF)作为微软推出的新一代图形系统,为开发者提供了强大的用户界面开发工具。对于想要深入学习 WPF 的开发者来说,从理论知识到实际项目的跨越是必经之路。在这个过程中,积累的实战经验不仅能帮助我们更好地掌握 WPF 技术,还能提升解决实际问题的能力。本文将分享从 WPF 初学者逐步成长为专家的实战项目经验,涵盖基础知识、项目实践、问题解决以及技术进阶等方面。

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

C#与WPF实现Kinect骨骼与彩色图叠加项目

本章系统地讲解了Kinect图像数据的坐标映射与合成技术,涵盖了从3D骨骼点到2D图像坐标的转换、骨骼图像与彩色图像的叠加方法、以及图像透明度控制与融合技术。通过本章的学习,开发者应能熟练掌握骨骼图像的渲染与合成流程,并具备优化图像显示与性能的能力,为后续的界面优化与性能调优打下坚实基础。

weixin_42596246的博客 721

WPF中绘图(含调用GDI+)

private void DrawStuff() { // //if (buffer == null) //{ // buffer = new RenderTargetBitmap((int)Background.Width, (int)Background.Height, 96,...

weixin_30314631的博客 1034

适合初学者的简单WPF计算器项目

WPF(Windows Presentation Foundation)是微软公司推出的一种基于.NET框架的用户界面框架。它允许开发者创建具有丰富视觉效果的桌面应用程序。WPF利用了矢量图形,可以自由缩放,并且在高分辨率的显示器上提供了清晰的图像输出。命名空间在XAML中用于区分不同类库中的同名元素和属性。它们通过xmlns声明,并指定前缀来区分。资源定义则允许在XAML中创建可重用的元素,比如样式或模板。<Grid></Style></Grid>上例中定义了一个命名空间local。

weixin_33308579的博客 858

WPF中的图形绘制

    WPF中一般可采用三种方法进行图形绘制, 1、采用shape进行图形绘制 SHAPE继承至FrameworkElement,具有可视化控件的一般属性,分别有Ellipse(圆或者椭圆)、Line(直线)、Path(绘制复杂图形的路径)、Polygon(多边形)、Polyline(相互连接的多条直线)、Rectangle(矩形),因为继承至FrameworkElement对象,上述形...

u012846041的专栏 1万+

IBM V3700更换控制器2(503错误)

正常的node1 ,机器代码版本:7.5.0.3, 机器代码构建:115.51.1509171734000。耐心等待后,刷新,看到node2,状态变成 节点状态:服务,错误:656,版本和node1一样了。新换的node2 ,机器代码版本:7.2.0.5, 机器代码构建:87.8.1404221000。耐心等待,刷新,node2,状态看到了,节点状态:活动,错误 724 1 1 0。拔出故障的控制,把内存和HBA卡,电池换到新的控制器。新的控制还是报错无法使用,节点状态:服务 错误:503。

klyshao的博客 4446

【项目实战】基于STM32单片机的智能小车设计(有代码)

【1】背景意义 近些年随着国民生活水平的提升,以小车为载体的轮式机器人进入了我们的生活,尤其是在一些布线复杂困难的安全生活区和需要监控的施工作业场合都必须依赖轮式机器人的视频监控技术。因此,基于嵌入式技术的无线通信视频监控轮式机器人应运而生。由于它们与人类工作相比具有成本低廉、安全稳定的优点,目前已经在许多危险作业以及工业场合得到了广泛应用而且轮式机器人不需要像人那样采取过多的保护措施,因此轮式机...

ShawnWang1994的博客 13万+

《探秘 BME680温度湿度气压气体传感器模块:环境感知的卓越之选》:此文为AI自动生成

BME680 是一款由博世公司推出的集成环境传感器模块,在环境监测和物联网等领域中发挥着重要作用。它能够同时测量温度、湿度、气压和气体浓度等多个环境参数,为各种应用提供准确可靠的环境数据。该模块采用小巧的封装形式,便于集成到各种设备中,无论是智能家居、可穿戴设备还是工业监测系统,都能轻松适配。例如,在智能家居系统中,BME680 模块可以监测室内环境参数,如温度、湿度、气压和空气质量等。通过与智能家居控制器或智能手机应用程序的连接,用户可以实时了解室内环境状况,并根据需要进行调整。

zheng_ruiguo的专栏 1865

WPF MVVM框架 漂亮界面风格的WPF 快速入门WPF实例 功能实用架构清晰易入门WPF 界面大方功能实用的WPF教程 WPF实战例子 WPF 简易DEMO

这个例子是一个简单的待办事项列表应用程序,它展示了 WPF 的核心概念和语法。另外,该例子还使用了 MVVM 模式,这是一个常见的 WPF 设计模式。通过这个例子,学习者可以了解 WPF 的核心概念和语法,并且掌握三层架构和 MVVM 设计模式的基本原理。视图负责显示应用程序的界面,模型负责保存数据,逻辑负责实现业务逻辑。WPF 快速开发框架,已经集成多种框架,可以直接修改使用在项目中,是入门及快速实施项目的最佳选择。然而,对于初学者来说,WPF 的概念和语法可能会让人望而却步。

十多年专注于上位机业务 1万+

中兴B860AV2.1-A刷机避坑指南:晶晨免拆神器+安卓7.1.2固件实测

本文提供中兴B860AV2.1-A机顶盒的详细刷机教程,重点介绍使用晶晨免拆神器配合安卓7.1.2线刷固件包的实操步骤。内容涵盖刷机前的硬件确认、工具准备、软件设置、烧录全过程监控及常见问题解决,旨在帮助用户安全、高效地完成刷机,规避变砖风险,释放设备潜力。

pytorch8learner的博客 745

STM32使用LORA模块通信

目录 一、模块使用方法 1、模块简介 2、硬件及功能 3、传输方式 二、模块上手 1、连接 2、编写代码 usart3.h usart3.c lora.h lora.c 一、模块使用方法 本文以正点原子ATK-LORA-01模块为例进行介绍。 1、模块简介 ATK-LORA-01-V3.0(V3.0是版本号,下面均以ATK-LORA-01表示该产品)是ALIENTEK推出的一款体积小、微功率、低功耗、高性能远距离LORA无线串口模块。模块设计是采用高效的IS...

qq_54706971的博客 3万+

wpf 自定义控件UserControl之NumericUpDownControl

wpf没有NumericUpDown这个控件,只有自己写,或找别人写好的,作为初学者,肯定自己写了 xmal页面,包括1个label, 2gebutton,1个textbox <Grid Margin="10"> <Grid.ColumnDefinitions> <ColumnDefinition /> ...

征途人生&梦 2192

AGX Orin 部署PyTorch与Torchvision 2026避坑指南

本文提供了2026年在AGX Orin开发板上部署PyTorch与Torchvision的详细避坑指南。针对ARM64架构和JetPack 6.2系统,重点解决了Python 3.10环境配置、官方wheel包安装、torchvision源码编译等关键步骤,并分享了常见问题解决方案和性能优化技巧,确保深度学习环境稳定运行。

sky77的博客 752

自学WPF学习日记(第一节)

大叔从0开始学习WPF,每节把时间规划好!咱不急他好吗? 为了不打击自己,第一节很努力就的只学了Grid布局,因为多了真的记不住。告诉自己,能学会就好,咱不急他好吗? 在本节中,我很实在的布了一个2行2列的Grid布局,没有太多的代码。 <Grid> <Grid.RowDefinitions> <RowDefinition></RowDefinition> <RowDefinition&g

u011096919的博客 321

【BUG已解决】pip install 出现 error: Microsoft Visual C++ 14.0 or greater is required 解决方案

方案磁盘占用适用场景推荐指数安装Build Tools3-6GB长期Windows Python开发⭐⭐⭐⭐⭐寻找预编译wheel无额外占用只是想快速装上某个包⭐⭐⭐⭐⭐用conda安装视包而定已经在用conda环境⭐⭐⭐⭐⭐升级到新版本无额外占用库本身有更新的预编译版本⭐⭐⭐⭐使用WSL2需要额外配置Linux子系统频繁遇到Windows编译问题⭐⭐⭐⭐的核心是Windows 缺少本地 C/C++ 编译器,而目标包需要在本机编译。先看是否有捷径。

博客 1万+

5G射频到底是啥?方案怎么搭?工作流程、SAW选型、PA选型一口气讲透(工程师秒懂版)

很多人一提 5G 射频,脑子里先冒出来的是几个零件名:👉 PA👉 LNA👉 SAW👉 天线👉 开关但真正做方案时,这些东西不是一堆分立器件,而是一条完整的“信号流水线”。更准确地说,。Qualcomm 对 RFFE 的定义就是“把信息转换成可发送的射频信号,并把接收到的信号转换回有用信息”的那一整套组件。

weixin_43199439的博客 533

初学者首选!工控视觉项目桌面端WPF源码,UI源码,完美实现前后端MVVM数据绑定,附带两个第...

VisionDispensingUI 是一套基于 WPF 技术构建的工控视觉点胶系统桌面端 UI 解决方案,采用 MVVM(Model-View-ViewModel)架构实现前后端数据绑定,整体遵循 .NET Framework 4.5.2 框架开发规范。系统核心聚焦于工业场景下的视觉定位、点胶参数配置、轨迹示教与数据统计等核心业务,除柱状图展示模块采用第三方开源控件(LiveCharts)外,其余功能模块均基于原生 WPF 组件开发,具备良好的稳定性与扩展性。

QmZVLlLHvXq的博客 46

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C# kinect v2学习笔记(三)红外图像展示

今天休假,晚上发现没更新记录呢。       从今天开始,就用WPF来写了,我从学习C#开始,就几乎没写几个控制台程序,感觉跳级学习还是蛮有压力的,而且从一开始就是从kinectV2学起,这简直坑爹啊,在要做体感开发之前,我压根不知道有这种东西好么? 好吧,我表示我又无知了,最恨的是我英语还很差啊!给同样入门的小白看看吧!      直接上代码,代码中文注释,一看就懂,没有压力,配合官方的AP

Dark的博客 5379

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

wpf程序 初试 wpf 模拟 实现

今儿晚上看到wpf的初步简介,想尝试一下用它把我08年写的那个模拟的.net2.0 winfrom的程序用wpf重新实现一把,发现像我这从来没有用wpf做过东西的人(hello world之类的程序除外)实现起来还是不太顺利的。 早点休息,明天继续.......

love19820823 139

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WPF初学第一课,了解WPF、Label、Button

了解WPF,介绍XAML,学习C#,争做新青年

m0_73707265的博客 1548

初学乍练WPF

WPF控件分类 在WPF中,控件的基类为Object,按照继承类的不同分为四类: 1.ContentControl——内容控件 继承自System.Windows.Controls.ContentControl;内建的内容控件分为3类: 1)按钮:Button、RepeatButton、ToggleButton、RadioButton、CheckBox

dabusidexiaoqiang的专栏 2635
上一篇: 经济萧条时代让我们温暖的10行业(做好准备)
下一篇: DataSet和DataReader的区别
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值