WPF阶段总结

WPF 学生成绩管理工具开发笔记(11) ——百名阶段统计 主要是利用sql语句实现分阶段统计,留用备查。 select sum( case when 校名次<=10 then 1 else 0 end) from xx 等效语句 select count( case when 校名次<=10 then 1 end) from xx 一、效果图 二、主要实现 Xaml <!--用于显示 百... 阅读详情

一、数据源就是对象,只不过是一个包含有数据的对象,如x:XData。而把这个对象中的数据提供给使用者的“中介对象”被成为数据提供者如XmlDataProvider。

 

二、margin属性就想象成一个带一圈空隙的控件。

 

三、使用Type类型创建一个窗口实例,Type对象是某个类型描述的一个包装

Window win=Activator.CreateInstance(Type类型的一个对象如button对象) as Window;

斯四、日常工作中打交道的控件无外乎6类

(1)布局控件:如Grid、StackPanel等,他们拥有共同的父类Panel。

(2)内容控件:只能容纳一个其他的控件作为他的内容,如Window、Button等控件,因为只能容纳一个控件作为其内容,所以经常需要借助布局控件来规划其内容,如Window中经常使用Grid,他们共同的父类是ContentControl。

(3)带标题的内容控件:相当于一个内容控件但可以加一个标题(Header),标题部分亦可容纳一个控件(包括布局控件),如GroupBox、TabItem等,他们共同的父类是HeadereContentControl。

(4)条目控件:可以显示一列数据,这列数据的类型可以不同但一般情况下相同,如ListBox、ComboBox等,此类控件在显示集合类型数据方面功能非常强大,共同基类是ItemsControl。

(5)带标题的条目控件:相当于一个条目控件加上一个标题,如TreeViewItem、Menutem,这类控件往往用于显示层级关系的数据,节点显示在Header区域,子级节点则显示在其条目控件区域,共同基类是HeaderedItemsControl。

(6)特殊内容控件:比如TextBox容纳的是字符串、TextBlock能容纳可自由控制格式的文本、Image容纳图片等,这里控件比较独立和Control类处于同一个继承级别。

上面六种控件继承关系如下图:

 

四、对于条目控件ItemsControl,他的合法内容一定是个集合,当我们把这个集合作为内容提交给ItemsControl时,ItemsControl不会把这个集合直接拿来用,而是使用自己“对应的条目容器”(系统内部自动使用,比如ListBox中的内容包装器就是ListBoxItem,只不过默认可以省略不写出来而已)来把集合中的条目逐个包装,然后再把包装好的条目序列当作自己的内容。这种自动包装的好处就是允许程序员想ItemsControl提交各种数据类型的集合,程序员只需要关注这个集合数据就行,如果需要增、删、更新或者排序,那么直接去操作数据集合就行了,UI会自动将改变展现出来,这正体现了WPF是数据直接驱动UI进行显示的。

这里补充:对条目控件使用DisplayMemberPath属性一般只能显示简单的字符串,如果想要显示复杂的数据需要使用DataTemPlate。

 

五、布局的经验

最后尽量用比例

如下面例子:

如果是上面的界面要求,该怎么布局呢?

Grid布局预览如下:

共5行5列,布局过程:首先考虑列,左上角文本占一列,因为文字块的宽度更具文字的字体大小具有确定的宽度,不会随着整个窗体的改变而改变。然后是右边的下来组合框应该紧靠着左边文字块,右边紧靠窗体右边沿,所以它的长度因随着窗体宽度而改变。中间的大文本框的宽度和高度按要求要随着窗体而改变,左右要紧挨着窗体的左右边沿。最后是连个按钮,两个按钮宽度固定且按钮间空隙也固定,所以可以优先考虑使用表格宽度固定,也就是优先考虑按钮的卡槽宽度固定(次好的方案是考虑设置按钮的width属性为固定值)。综上要画5列,而最左边的列里装着文字块(宽度随字体大小确定),所以应该设为此列宽度自动,而且为避免窗体太小容不下字体快了,要设置此列的最小值。

对行的布局,按图上要求就行了,比较简单。

最后是空出Grid的四个边沿各留10像素的空白即可。

总结一个原则:尽量用卡槽确定卡槽内部控件的宽度和高度,也就是让卡槽内部的控件尽量100%填充已经确定好的卡槽。

下面是设计的代码:

下面是最终效果图:

 

六、附近属性的来历

为什么不使用Button.Row而使用Grid.Row呢?原因很简单,因为Button设计时并没有规定Button一定要放在Grid里面,所以就不应带有Row属性。只有它放在Grid里,Row属性才有意义,也就是说这类属性不是控件固有的而是被Grid附加上的,所以叫附加属性。

 

七、GridSplitter分割条会改变Grid先前设置好的行高或列宽。

 

八、Binding

(1)对"{Binding Path="abc"}"这个整体表达式的理解,不要理解成返回一个绑定类型的数据(很容易这样误解),应理解成像函数调用一样返回一个值,即这个整体表达式返回一个值,这不过这个值像函数一样是通过内部复杂运算最终产生的。但他不是固定的,产生绑定(关联)关系后,以后两个关联数据会同步更新。

另外,绑定Bnding还支持“多级路径”,即路径属性可以是多个“点”号。如:

《TextBox x:Name="textBox2" Text="{Binding Path=Text.Length,ElementName=textBox1}" /》

等价于后台代码:

this.textBox2.SetBinding(TextBox.TextProperty,new Binding("Text.Length"){Source=this.textBox1});

也就是说,Path可以赋予绑定对象的某个属性一路点下去的值。对于这种较复杂的情况,只要把Path翻译为等于“数据源对象.属性.的某个东西.某个东西”即可,最典型的是TextBox控件绑定到列表控件的某个选择的项目的ID,如{Binding SelectedItem.Id Source="ListBox"},甚至还可以如下使用:"{Binding Path=Text.[3],ElementName=textBox1}";这是因为c#中集合类型的索引器Indexer(用“[3]”代替调用)又称为代参属性,所以索引器也可以作为Path来使用(使用中就把“[3]”这个符合看成和Length等价的属性即可,后台代码就略了)。

 (2)另外Binding中还经常使用“/”表示使用绑定的对象的默认属性作为Path。还使用“.”点号代表Path就是使用数据源本身,尤其数据源就是一个string或int类型的数时,点号甚至在XAML中还可以省略。最最极端的还会碰到如"{Binding}",这样的即省略Path又省略Source的情况,是因为寻找的默认的DataContext的内容就是一个单数据。

 (3)对于ItemsControl的绑定比较特殊,比如在后台不用显示建立Binding对象,只需要指定DisplayMemberPath属性,他会自动帮我门建立好Binding对象并绑定到ItemsControl对象。所以对于ItemsControl只需要在后头设定Source和DisplayMemberPath两个属性即可建立绑定。

如果深究的话,实际上当DisplayMemberPath属性被赋值后,ListBox在获得ItemsSource(集合)的时候就会创建等量的ListBoxItem外衣包住数据源集合中的的项目,并以DisplayMemberPath属性值为Path创建Binding,Binding的目标是ListBoxItem的内容插件(就是在ListBoxItem中插入一个TextBox作为接收数据的目标并显示出来)。这个绑定的过程实在一个内部的函数中具体完成绑定的,而且这个函数返回一个DataTemplate类型的对象,这个DataTemplate类型是一个默认的(也是最简单的),实际上就是包了一个没边框的TextBox(记住默认只有一个,也就是显示一列,实际上也只指定了一个DisplayMemberPath属性),就好像给数据穿上了一件最简单的衣服一样。当然可以显示的设置DataTemplate属性代替默认的DataTemplate来显示数据,如下:

在后台只需加上设置ListBox的Source属性为一个集合即可,结果显示如下:

可以看出,上面ListBox有点ListView效果了。一般说ListBox和ListView区别在于,Box是Window标准控件,而View需要更多库支持且多媒体内容丰富,外观上一般ListBox唱用来显示一列多行的东西,而ListView显示多列多行的东西,就是一个表格的东西,ListView的View属性就是一个GridView(而gridview就是表格)。

更深入的:ListView是ListBox的派生类,而GridView是ViewBase的派生类,ListView的View属性是一个ViewBase类型的对象,所以,GridView可以作为ListView的View来使用而不能当作独立的控件来使用。这里使用的是组合模式,即ListView中有一个View,至于这个View是GridView还是其他什么类型的View则又程序员自由选择。如下代码:

在后台,只需将ListView的数据源ItemsSource设为一个DataTable对象即可,如=dt.DefaultView。

这里有一个小细节要注意,如果直接把DataTable对象赋予ItemSource属性会得到一个编译错误,所以一般使用DataTable的DefaultView默认视图,但是如果把DataTable对象赋予DataContext属性,有控件自己去找数据源,折不会出现编译错误,实际上系统会自动使用那个DataTable对象的DefaultView当作自己的Source来使用。

当然还可以更偷懒的不设置ListView的GridView中的DiaplayMemberPath属性,直接在后台写如下代码:

this.listView.DataContext=dt;

this.listView.SetBinding(ListView.ItemsSourceProperty,new Binding());

这样显示的使用空的Binding对象(空绑定表示绑定所有属性)并不使用DisplayMemberPath属性,则会把dt的默认视图完全显示在ListView上。

 

九、控件模版和数据模版

控件模版是控件的外衣,数据模版是数据的外衣,他们两个分别对应Control的Template和ContentTemplate(或ItemTemplate,gridview中还有CellTemplate)两个属性。对于数据模版,ContentTemplate相当于给内容控件的内容部分穿上一件外衣,而ItemTemplate相当于给条目控件的每个条目穿上一件外衣。如果要说他们有什么关系的话,如下图:

 从图中可以看出,两个分别模版套用在控件的不同部分罢了,另外控件模版中使用绑定用{ControlBinding},而数据模版使用{Binding}。另外,如果要将两种类型的模版分别用在某种类型的控件或数据上自动套用,而不用显示的设置控件的Template或ContentTemplate属性,那么需要去除模版定义中的x:Key属性以及分别对应设置TargetType和DateType属性为{x:Type Text或自定义类名称},这样之后,所有的Text或所有绑定到自定义类的对象作为内容部分(Content或Items)或数据源(ItemsSource,因为这个源也是属于控件的内容部分)的控件都自动套用相应的模版。

【其实,简单的理解控件模版和内容模版中定义的控件标签和特性就是】:

对于控件模版,把他里面定义的所有标签和特性想象成一个正常控件的外围(除了内容区域,虽然控件模版包括内容区域但它一般是用来定义非内容区域的外形的)对应的标签和标签的特性。

对于数据模版,把他里面定义的所有标签和特性想像成一个正常控件的内部(内容部分)对应的标签和标签的特性。

有了上面的简单理解,那么如果在内容模版中出现类似《TextBox Text="{Binding Name}"》,其中的绑定就好理解了,无非是想象成内容部分包含了一个TextBox标签,而这个TextBox的Text属性绑定到内容显示的数据对象的Name属性。而这里“内容显示的数据”该怎样理解呢?就理解成这个子控件往上找(包括自己)直到找到一个数据为止,而这个数据可能是一个数据源,也可能是一个DataContent等。最常见的是外围控件的ItemsSource属性对应的值。

【我理解就把数据模版想象成内容部分的子控件就行】

其实数据模版作用在的对象就是“ContentPresenter”,而ContentPresenter也是一个控件,Content属性就是这个内容ContentPresenter的属性。【为了方便使用控件也具有和内容呈现器一样的属性Content,给控件Content属性赋值就同时给了内容呈现器的Content属性赋值。实际上控件树上看到的是Content属性,而外观树上看到的是ContentPresenter子部件,只不过这个子部件中有一个Content属性且这个属性的值等于控件树上的Content属性的值】

 

十、样式

下图是样式style内部的结构:

注意:style内部有三大并列地位的子元素设定器Setters,触发器集合Triggers和资源集合Resources。其中设定器是默认子元素,所以经常看到style内部直接使用setter而不用setters包着。单个触发器Trigger和单个设定器Setter区别就在于前者是根据条件添加上各种属性值,而后者是无条件添加上各种属性值【只不过Trigger内部也使用Setter来设置属性罢了,容易误解为Setter是比Trigger第一个级别的元素,实际上他们是并列地位,至于使用在Trigger内部的Setter不用特别关注地位问题,记住就行】。

关于设定器,常常遗忘事件设定器EventSetter,用于处理当类似于“Event=MouseEnter”时处理事件程序【理解为给style加一个动态的属性,即增加一个事件属性,只不过这个属性有条件的,满足如MouseEnter条件时才执行那个改变状态的东西----事件处理程序】

关于触发器,一般说的触发器|Trigger都是指属性触发器,即依赖与属性,当属性为某个值时触发。多项触发器MutiTrigger就是依赖于多个属性的多属性触发器,这两类触发器本质都是属性触发器,一般用在样式Style内部。还有事件触发器EnentTrigger、数据触发器等,用在其它场合。这写触发器都是并列地位,只不过用在不同的地方而已,如属性触发器用在Style中,事件触发器用在动画中。

 

十一、样式、模版、触发器的关系

样式和模版是一个级别的东西,触发器比他们两个的级别低,常常用作样式和模版的子元素。

下面就比较样式和模版的区别:

首先,形式上比较,两者处于并列地位都是资源对象。只不过定义对象是使用Style、ControlTemplate和DataTemplate三种关键字罢了(即Style不是接口类是个具体类,而Template是个接口类,必须用具体的子类实例化)。

其次,功能或用途上比较,两者功能可能有重复,即有时style能实现的样式用Template也可以实现,反之亦然。但区别在于style常用于宏观,且只能改变控件可视的属性的值。而Template常常用于微观,甚至改变控件内部的结构(比如原来内部是由两个TextBox组成,现在改成由三个Rectangle组成)。可以说,Template功能更细致和强大,Style做到的基本上Template都能做到。当然Style写起代码来更方便。

第三、一般用在什么地方,由于可以认为Style只能改变样貌,而Template不仅可以改变样貌,还能改变内部的组成结构。所以style一般用在简单改变控件外貌上(Style定义是内部子元素都是用Setters包着的Setter之类的设定属性值的子元素或Triggers包着的Trigger之类的根据条件的设定属性值的子元素),而Template一般用在改变控件内部组成上(所以Template第一时内部子元素都是用Grid包起来的Ellipse、Rectangle等的形状元素,当然Template内部的子元素也可以是Triggers,此时Triggers和Style中的Triggers一模一样)

 

十二、关于Resources、Style、Template和Triggers的地位问题详细解释

其实上面解释的样式、模版和触发器的地位问题并不准确。关于地位问题要分两者情况:

(1)为了作为共享资源定义在资源集合中,即Resources中,此时Resources>Styles=Templates>Triggers(大于号是指包含的关系)

(2)直接用做控件的属性,如在Button,此时Button具有Resources(这个资源指Button的子资源,而上面的资源指全局共享的资源)、Style、Template和Triggers属性。即Resources=Styles=Templates=Triggers。

总之就是分为用在Resources和直接用在Control内部两者情况。

总结就是,作为共享资源时,考虑他们之间的包含关系。作为控件的属性时,同时具有这四个属性,具体定义时再考虑他们直接的包含关系(比如在Button中直接定义一个Style对象,此Style中再包含Triggers)

【愚公系列】2023年10月 WPF+上位机+工业互联 038-Application生命周期 Application生命周期指的是从应用程序启动到关闭整个过程中的各个阶段。在Android系统中,Application生命周期可以分为以下几个阶段:创建阶段:在这个阶段中,系统会创建应用程序的Application对象,并调用其onCreate()方法。运行阶段:在这个阶段中,应用程序处于活动状态,响应用户的交互操作。停止阶段:在这个阶段中,应用程序处于后台运行状态,不再响应用户的交互操作。 阅读详情

相关推荐

【朝夕教育】2023年08月 WPF+上位机+工业互联 038-Application生命周期

Application生命周期指的是从应用程序启动到关闭整个过程中的各个阶段。在Android系统中,Application生命周期可以分为以下几个阶段:创建阶段:在这个阶段中,系统会创建应用程序的Application对象,并调用其onCreate()方法。运行阶段:在这个阶段中,应用程序处于活动状态,响应用户的交互操作。停止阶段:在这个阶段中,应用程序处于后台运行状态,不再响应用户的交互操作。

微软MVP Eleven 268

18WPF---MVVM模式

预定义命令内置命令自定义UICommand任意事件的绑定处理。

qq_58563355的博客 547

Mac新手必看:用Homebrew安装wget的保姆级教程,附常见报错一键修复

本文为Mac新手提供使用Homebrew安装wget的详细教程,涵盖从Homebrew安装到wget基础使用的全流程,并附常见报错一键修复方案。通过本指南,用户可轻松掌握命令行下载工具wget的安装与使用技巧,解决Mac环境下资源下载的各种问题。

weixin_30635053的博客 365

WPF通过反射机制动态加载控件

是 .NET 提供的一个静态方法,它属于System命名空间。此方法通过反射机制根据提供的类型信息(在这里是)创建该类型的实例。在这个上下文中,属性的类型是,它代表了 .NET 中的一个类型对象。当我们将传递给方法时,我们实际上是将这个Type对象传递过去,// 定义一个公共属性 SubTLWindows,用于存储关联的窗口类型。// 这个属性允许在 XAML 中通过绑定设置为特定的 Window 类型。set;// 重写 OnClick 方法,以便当按钮被点击时执行自定义逻辑。

gjw3037109961的博客 945

QT | QT打包生成单个EXE文件

1.以release方式运行程序 2.在release文件夹中找到.exe文件 如果没有找到exe,可能是因为在项目中勾选了shadow build,你可以在构建目录中找到exe 3.将exe放在一个新建的文件夹中,因为待会儿会生成很多dll文件 4.点击电脑左下角搜索QT,打开Qt 5.8 for Desktop (MinGQW 5.3.0 32bit) 5.进入刚刚新建的文件夹,输入wi...

⊳ideal world⊲~ヽ(゚︺゚)Hi 1238

RK3588与FPGA高速PCIe通信:从理论带宽到实战优化的全流程解析

本文深入解析了瑞芯微RK3588与FPGA之间基于PCIe Gen2的高速通信全流程。从理论带宽计算(约1640MB/s)出发,详细拆解了硬件连接、驱动加载、DMA配置等关键步骤,并重点分享了中断优化、内存管理及高级调优等实战技巧,旨在帮助开发者从“跑通”到“跑好”,实现接近理论极限的稳定高效数据传输。

weixin_29175469的博客 331

C#中Activator.CreateInstance()方法用法分析

本文实例讲述了C#中Activator.CreateInstance()方法用法。分享给大家供大家参考。具体分析如下: Activator 类 包含特定的方法,用以在本地或从远程创建对象类型,或获取对现有远程对象的引用。 C#在类工厂中动态创建类的实例,所使用的方法为: 1. Activator.CreateInstance (Type) 2. Activator.Create...

dingshi6331的博客 398

FreeModbus V1.6主机模式实战:如何在STM32上实现Modbus RTU主从一体通信

本文详细介绍了如何在STM32平台上利用FreeModbus V1.6开源协议栈实现Modbus RTU主从一体通信。文章深入剖析了V1.6版本主机模式的架构设计,提供了从硬件配置、串口与定时器移植到FreeRTOS操作系统适配的完整实战指南,并分享了数据缓冲区管理、多线程协同及高级调试技巧,为构建稳定可靠的工业通信网关提供了系统化解决方案。

weixin_29194255的博客 372

Activator.CreateInstance 与 Type.InvokeMember的区别

当谈到Activator.CreateInstancevs的性能结果时Type.InvokeMember,无参数构造函数的情况明显胜出:Activator.CreateInstance。但是当我们开始需要参数或使用带参数的主构造函数时,它开始均衡甚至有利于Type.InvokeMember。

仰望星空的博客 2079

Quest 3开发第一步:搞定Meta账号登录和Oculus软件连不上设备的那些坑(2024实测)

本文详细介绍了Quest 3开发初期的关键步骤,包括Meta账号注册、Oculus软件安装与设备连接等常见问题的解决方案。针对国内开发者遇到的邮箱限制、验证码接收等难题,提供了实用的应对策略,并分享了开发环境配置和常见问题排查技巧,帮助开发者快速搭建Quest 3开发环境。

weixin_30333885的博客 491

查找【优快云】- 人工客服

【代码】查找【优快云】- 人工客服。

👨‍💻 前端开发者 | 技术分享者 1395

WPF 后台动态加载UserControl的一种方法

  今天在看以前的项目时看到前辈们在后台加载UserControl的一种方法:1.在前台建一个Contentcontrol,Name="ctr1"。2.写一个函数,如下:public Object CreatUsercontrol(){    string ctrName= "WpfApplication1.UserControl1"; //WpfApplication1为要添加的Usercont...

u014264186的博客 9235

具身大小脑全栈全网独家复现|LLM链式推理+边缘VLA感知+毫秒级运动小脑、优化人形步态僵硬运动滞后、打通思考-行走-操作全链路适配居家工业多场景落地

高层决策大脑(异步10Hz,GPU算力):轻量化机器人微调LLM+RhinoVLA边缘视觉大模型,负责自然语言链式工序拆解、全局环境语义感知、目标物体筛选、跨机器人动作适配,输出粗粒度运动目标,不介入底层伺服计算;依托View Registry实现异构机器人动作对齐,适配多形态机器人切换;中层调度小脑(硬实时1kHz,CPU算力)

qq_36130719的博客 255

WPF UI学习路径:从入门到精通的10个阶段

**核心任务**:配置开发环境并创建第一个WPF UI项目 **技术点**:.NET SDK安装、Visual Studio配置、WPF UI模板使用 ### 环境准备 1. 安装[.NET 6+ SDK](https://dotnet.microsoft.com/download) 2. 配置Visual Studio 2022(安装"Desktop Development with ...

gitblog_01167的博客 1100

嵌入式系统开发笔记101:STM32CubeIDE安装过程中的2个错误及其解决方法

STM32CubeIDE在安装过程中,遇到了2个错误,本文阐述其解决方法。产生上述错误的原因,都在于中文。STM32CubeIDE不能很好的支持中文,所以在使用STM32CubeIDE进行项目设计的过程中,不要使用中文,包括项目所在的路径。

snmplink的博客 8550

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

WPF 数据绑定阶段性总结

WPF数据绑定核心总结 WPF数据绑定是连接UI与业务逻辑的核心机制,支持双向同步、灵活数据源和MVVM集成。关键点包括: 绑定模式:支持OneWay/TwoWay/OneTime等同步方式 更新触发:通过PropertyChanged或LostFocus控制更新时机 转换器:实现IValueConverter处理数据格式化 验证机制:结合INotifyDataErrorInfo实现输入校验 集合绑定:使用ObservableCollection实现动态列表更新 与MVVM集成时,推荐: 使用Communi

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 189

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

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

现阶段的SliverLight(WPF/E)现在到底是什么

 现阶段的SliverLight(WPF/E)现在到底是什么SliverLight这段时间已经闹得沸沸扬扬了,也许大家对他还是一知半解,这篇文章是出自微软WPF/E产品组的主管的解答,我认为是比较准确的,没有把SliverLight说得像外面传说的那么夸张。其实在目前SliverLight 1.0 Beta阶段它还只能是与HTML互补,代替以前的一些VML,SVG,FLASH功能。Sliv

MKing's Blog 5332

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

关于WPF(三)布局

布局 WPF用不同的容器(container)安排布局。每个容器有各自的布局逻辑——有些容器以堆栈方式布置元素,另一些容器在网格中不可见的单元格中排列元素,等等。 一、理解WPF中的布局 1.1.WPF布局原则 WPF窗口只能包含单个元素。为在WPF窗口中放置多个元素并创建更贴近实用的用户界面,需要在窗口上放置一个容器,然后在这个容器中添加其他元素。 在WPF中,布局由您使用的容器来确定。尽管有多个容器可供选择,但“理想的”WPF窗口需要遵循以下几条重要原则: 1.不应显式设定元素(如控件)的尺寸。元素应当

yang_jianfeng的博客 356

【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结...

篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblogs.com/baiboy/p/wpf1.html 篇三:批量处理后的txt文件入库处理:h...

chuange6363的博客 198

WPF之布局流程

Windows Presentation Foundation (WPF) 的布局系统是WPF应用程序中的核心部分,它负责计算界面中每个元素的大小和位置,并最终呈现到屏幕上。理解WPF的布局流程对于创建高性能、响应迅速的用户界面至关重要。WPF布局系统是一个递归系统,它会自顶向下地处理视觉树中的每个元素。布局过程主要包括三个阶段:测量(Measure)、排列(Arrange)和渲染(Render)。除此之外,布局事件在整个流程中也扮演着重要角色。

冰茶的博客 1708

【基于WPF+OneNote+Oracle的中文图片识别系统阶段总结】之篇一:WPF常用知识以及本项目设计总结

篇一:WPF常用知识以及本项目设计总结:http://www.cnblogs.com/baiboy/p/wpf.html 篇二:基于OneNote难点突破和批量识别:http://www.cnblogs.com/baiboy/p/wpf1.html 篇三:批量处理后的txt文件入库处理:http://www.cnblogs.com/baiboy/p/wpf2.html 篇四:关于

ryb666666的专栏 641

WPF免费课程讲解一阶段总结(2024-9-20至2024-10-07)

每一个问我问题的小朋友看到他们渴望的眼神我真的觉得某些行业与某些机构把他们害的不浅。所以,在这之前,请大家尽量给我提一些意见,尽可能的关注我的csdn与bilibili帐号。这个是wpf的password的使用,是学习wpf项目实现用户登录必会的组件。这节课主要讲解的wpf的texbox事件,学习wpf都是从这个控件开始的。这节课主要是开课的,给大家讲一下wpf的地位与钱景。这节课讲的是wpf中动态资源的使用,是必用会的。wpf中最强的布局元素,也是用得最多的布局元素。这节课给大家讲了wpf项目的创建。

weixin_50541844的博客 655

WPF 布局

WPF窗口只能包含单个元素。为了使窗口中放置多个元素,需要使用容器,容器中可以添加多个元素。造成这个原因是window类继承自ContentControl类。 布局遵循的原则: 1.不应该显式指定元素(控件)的尺寸。 2.不应该使用屏幕坐标指定元素的位置。 3.容器的子元素共享可用空间。 4.使用可镶套的容器,比如顶层是grid。 布局过程: 分成2个阶段,测量阶段和排列阶段。 测...

weixin_34032827的博客 74
上一篇: c++字符编码的总结(ANSI、Unicode、UTF、UCS)
下一篇: 收藏的网页-c/c++
HNFXS985
博客等级 码龄14年 219粉丝 150原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值