当前位置: 首页 > news >正文

WPF学习(4)- VirtualizingStackPanel (虚拟化元素)+Canvas控件(绝对布局)

VirtualizingStackPanel虚拟化元素

VirtualizingStackPanel 类(虚拟化元素)和StackPanel 类在用法上几乎差不多。其作用是在水平或垂直的一行中排列并显示内容。它继承于一个叫VirtualizingPanel的抽象类,而这个VirtualizingPanel抽象类继承于Panel布局基类。

1. VirtualizingStackPanel 作用

比如在ListBox集合控件中需要显示500条数据,那整个屏幕只能显示20条,剩余的480条数据在ListBox控件要不要一次性绘制出来?其实就算绘制出来,用户的屏幕也看不见,只能是拖动滚动条才能看见后面的数据。既然屏幕只能显示20条数据,何不只绘制20条数据的UI子元素,剩下的480条数据的子元素在拖动滚动条时才绘制,这将大大减少计算机的性能消耗,提高UI界面的呈现速度,提高软件的流畅性。其实就是所谓的延迟加载。

所以,VirtualizingStackPanel 类的作用是开启虚拟化技术,延迟那些看不见的子元素的绘制与渲染。

要开启这项技术,只需要设置Listbox集合控件的附加属性**VirtualizingStackPanel.IsVirtualizing=“True”**即可。因为ListBox的ItemsPanel(元素布局模板)默认采用了VirtualizingStackPanel控件布局。

Canvas控件(绝对布局)

Canvas控件允许我们像Winform一样拖拽子控件进行布局,而子控件的位置相对于Canvas来说是绝对的,所以我将它称为绝对布局。我们来看看它的结构定义:

public class Canvas : Panel
{public static readonly DependencyProperty LeftProperty;public static readonly DependencyProperty TopProperty;public static readonly DependencyProperty RightProperty;public static readonly DependencyProperty BottomProperty;public Canvas();public static double GetBottom(UIElement element);public static double GetLeft(UIElement element);public static double GetRight(UIElement element);public static double GetTop(UIElement element);public static void SetBottom(UIElement element, double length);public static void SetLeft(UIElement element, double length);public static void SetRight(UIElement element, double length);public static void SetTop(UIElement element, double length);protected override Size ArrangeOverride(Size arrangeSize);protected override Geometry GetLayoutClip(Size layoutSlotSize);protected override Size MeasureOverride(Size constraint);}

观察它的结构,我们可以看到它提供了4个依赖属性,分别是LeftProperty,RightProperty,TopProperty和BottomProperty。其实是将这4个属性附加到子元素身上,以此来设置子元素距离Canvas上下左右的像素位置

1. 不设置属性情况下

    <Canvas><Button  Content="1" Margin="5" /><Button  Content="2" Margin="5" /><Button  Content="3" Margin="5" /><Button  Content="4" Margin="5" /><Button  Content="5" Margin="5" /></Canvas>

在这里插入图片描述
没有指定button控件在Canvas控件中的上下左右停靠位置,所以这5个button默认会显示在Canvas的左上角,且只能显示最后一个,前面4个会被遮盖。

2. 设置布局属性

    <Canvas><Button  Content="1" Margin="5" Canvas.Left="50"/><Button  Content="2" Margin="5" Canvas.Top="50"/><Button  Content="3" Margin="5" Canvas.Right="50"/><Button  Content="4" Margin="5" Canvas.Bottom="50"/><Button  Content="5" Canvas.Left="200" Canvas.Top="150" /></Canvas>

在这里插入图片描述

第一个button,设置了Canvas.Left=“50”,它将保持距离Canvas左边50像素。
第二个button,设置了Canvas.Top=“50”,它将保持距离Canvas顶部50像素。
第三个button,设置了Canvas.Right=“50”,它将保持距离Canvas右侧50像素。
第四个button,设置了Canvas.Bottom=“50”,它将保持距离Canvas底部50像素。
第五个button,设置了Canvas.Left=“200” Canvas.Top=“150”,也就是同时距离Canvas左边200像素,顶部150像素。

相关文章:

WPF学习(4)- VirtualizingStackPanel (虚拟化元素)+Canvas控件(绝对布局)

VirtualizingStackPanel虚拟化元素 VirtualizingStackPanel 类&#xff08;虚拟化元素&#xff09;和StackPanel 类在用法上几乎差不多。其作用是在水平或垂直的一行中排列并显示内容。它继承于一个叫VirtualizingPanel的抽象类&#xff0c;而这个VirtualizingPanel抽象类继承…...

SQL约束

目录 1.常见的SQL约束 1.1 添加主键约束 1.2 单独添加主键约束 1.3 删除主键约束 1.4 设置自动增长 2.添加非空约束 3.添加唯一约束 4.添加默认值约束 我们已知道&#xff0c;创建数据表语法&#xff1a; create table 表名(字段名1 数据类型(长度) [约束],字段名…...

lombok使用@slf4j 运行时提示找不到符号log(Missing POM for org.projectors:lombok:jar)

1.问题表现 原本是之前搭建好的工程&#xff0c;只是换了个开发环境重新启动就不行了。一直编译不通过&#xff01; 可以看到IDEA其实是引入了依赖的 都没有出现红色波浪线 <mapstruct.version>1.5.5.Final</mapstruct.version> <lombok.version>1.18.30<…...

21. 合并两个有序链表(递归)

目录 一;题目&#xff1a; 二代码; 三&#xff1a;结果&#xff1a; 一;题目&#xff1a; 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 二代码; /*** Definition for singly-linked list.* struct ListNode {* …...

学习vue3 三,组件基础,父子组件传值

组件基础 每一个.vue 文件都可以充当组件来使用 每一个组件都可以复用 父组件引入之后可以直接当标签使用 案例&#xff1a; App.vue <script setup lang"ts"> import BaseRefAndReactive from "./components/BaseRefAndReactive.vue";</sc…...

月木学途开发 2.项目架构

1.项目介绍 月木学途是一款it在线学习网站&#xff0c;项目采用前后端分离架构。前端开发主要使用vue.js&#xff0c;后端使用Spring Cloud Alibaba技术栈。项目包含学习网站的大部分功能&#xff0c;分为管理员端和用户端。管理员端有权限管理、课程管理、网站管理、求职模块管…...

FPGA开发——按键控制数码管的设计

一、概述 按键控制数码管是一种常见的电子显示技术&#xff0c;它结合了按键输入与数码管显示的功能。在这一设计中&#xff0c;用户通过按下不同的按键来发送指令&#xff0c;这些指令随后被处理并转换为数码管上显示的数字或字符。按键通常作为输入设备&#xff0c;通过电路…...

【AI学习】[2024北京智源大会]具身智能:具身智能关键技术研究:操纵、决策、导航

具身智能关键技术研究&#xff1a;操纵、决策、导航 董 豪 | 北京大学助理教授 依然是边看边做些记录 这张图的重点是在说&#xff0c;我们的大脑&#xff0c;也是不同的部分处理不同的功能。这里面有些功能&#xff0c;比如视觉、听觉理解等功能&#xff0c;LLM已经具备&…...

C语言实现UDP广播

UDP 广播发送方 1.创建套接字&#xff1a;使用socket()函数创建一个UDP套接字。 2.设置套接字选项&#xff1a;使用setsockopt()函数设置SO_BROADCAST选项以允许广播。 3.发送数据&#xff1a;使用sendto()函数将数据发送到特定的广播地址和端口。 #include <stdio.h> …...

速记Java八股文——Redis 篇

前言 分类汇总 50 常见的 Redis 篇 经典后端面试题&#xff0c;并对题目进行了精炼总结&#xff0c;旨在帮助大家高效记忆&#xff0c;在面试中游刃有余&#xff0c;不至于陷入词穷的窘境。 Redis 篇 什么是Redis? Redis是一个开源的内存数据结构存储系统&#xff0c;可用作数…...

CUDA编程05 - GPU内存架构和数据局部性

一&#xff1a;概述 到目前为止&#xff0c;我们已经学会了如何编写 CUDA 核函数&#xff0c;以及如何设置和分配大量线程来执行核函数。我们还了解了当前 GPU 硬件的计算架构&#xff0c;以及线程在硬件上调度执行过程。在本章中&#xff0c;我们将重点关注 GPU 的片上(on-chi…...

TCP协议程序设计

文章目录 前言一、TCP协议程序是什么&#xff1f;二、使用步骤 1.服务器端与客户端2.实操展示总结 前言 TCP网络程序设计是指利用Socket类编写通信程序。利用TCP协议进行通讯的两个应用程序是有主次之分的&#xff0c;一个称为服务器程序&#xff0c;另一个称为客户机程序&…...

【C++高阶】:自定义删除器的全面探索

✨ 我凌于山壑万里&#xff0c;一生自由随风起 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&am…...

Java中的不可变集合、Stream流以及异常处理的

目录 1. 不可变集合 如何创建不可变集合 2. Stream流 Stream基本操作 3. 异常处理 异常的分类 异常处理机制 1. 不可变集合 在Java中&#xff0c;不可变集合指的是一旦创建后内容不可更改的集合。这种集合的好处在于它们可以安全地被多个线程访问而无需同步&#xff0c;…...

LeetCode面试题Day1|LeetCode26 删除有序数组中的重复项、LeetCode80 删除有序数组中的重复项Ⅱ

前言&#xff1a; 暑假实在不知道干什么了&#xff0c;做一下力扣的《面试经典150题》吧&#xff0c;记录一下学习轨迹。(如果有要打非中文竞赛或者精进一下英语水平的记得把力扣调成英文) 题目1&#xff1a; 指路&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;26…...

细说文件操作

你好&#xff01;感谢支持孔乙己的新作&#xff0c;本文就文件操作与大家分享我的思路。 希望能大佬们多多纠正及支持 &#xff01;&#xff01;&#xff01; 个人主页&#xff1a;爱摸鱼的孔乙己-CSDN博客 目录 1.什么是文件 1.1.程序设计文件 1.1.1.程序文件 1.1.2.数据文…...

Vue3从零开始——掌握setup、ref和reactive函数的奥秘

文章目录 一、Vue 3 组合式 API 概述二、setup​ 函数的基本使用2.1 setup​ 函数的特点2.2 setup​ 函数的基本结构2.3 实现一个简单的小demo 三、ref​ 函数的功能和应用3.1 ref​函数介绍3.2 基本使用3.2.1 定义ref​数据3.2.2 修改响应式变量 3.3 使用ref​函数实现计数器 …...

C语言练习--屏幕上打印九九乘法表

int main() { int i 0; for (i 1; i < 10; i) { int j 0; for (j 1; j <i; j) { printf(" %d*%d%2d", i, j, i * j); } printf("\n"); } return 0; }...

将tsx引入vue

按钮 vue <cl-batch-btn >新增批量</cl-batch-btn> import batch from "//modules/ad/components/ uploading/batch.vue" import ClBatchBtn from "/~/crud/src/components/batch-btn"; tsx...

前端实现签字效果+合同展示

文章目录 获取一个高度会变的元素的高度获取元素设置的 transform适配手机transform-origin: 5% 0; 的原因修改后 签字效果取消el-dialog的头部边距为什么禁止界面滚动vue3 使用 nextTick实现效果 签字判断是横是竖canvas 去掉空白部分canvas裁剪图片最终完善代码&#xff0c;可…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题&#xff1a;map 的 key 可以是什么类型&#xff1f;哪些不可以&#xff1f; 在 Golang 的面试中&#xff0c;map 类型的使用是一个常见的考点&#xff0c;其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

如何在看板中有效管理突发紧急任务

在看板中有效管理突发紧急任务需要&#xff1a;设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP&#xff08;Work-in-Progress&#xff09;弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中&#xff0c;设立专门的紧急任务通道尤为重要&#xff0c;这能…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

实现弹窗随键盘上移居中

实现弹窗随键盘上移的核心思路 在Android中&#xff0c;可以通过监听键盘的显示和隐藏事件&#xff0c;动态调整弹窗的位置。关键点在于获取键盘高度&#xff0c;并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...