如何设置和获得控件相对于Canvas的位置

WPF (容器控件5)Canvas控件的详细教程 Canvas 是 WPF 中的一个布局控件,用于精确控制子元素的定位。与其他布局控件不同,Canvas 不会自动排列子元素,而是让你明确指定每个子元素的坐标。Canvas 适合用于需要精确定位的场景,如绘图应用、游戏界面等。 阅读详情

Canvas是WPF中常用的控件,今天第一次使用,有很多属性都不熟悉,不过用过了的就要记住,下一次就不会再犯愁如何使用啦。
Canvas中的控件可以任意布局,并且能够获得较为精确的位置,那么如果设置控件相对于Canvas的位置呢?如下:
设置位置: Canvas.SetLeft(ControlName, LocationX1);
Canvas.SetTop(ControlName, LocationY1);
Canvas.SetRight(ControlName, LocationX2);
Canvas.SetBottom(ControlName, LocationY2);
获得位置: Canvas.GetLeft(ControlName);
Canvas.GetTop(ControlName);
Canvas.GetRight(ControlName);
Canvas.GetBottom(ControlName);

简单的属性设置,却帮了我的大忙,成功的解决了按钮后台生成并自动布局的问题,本着分享的原则,代码如下:

  private void AddCanvasControl(List<string> aTypeStrList)
        {
            int aLocationX = 0;
            int aLocationY = 0;
            rCanvas.Children.Clear();
            foreach (string aStrType in aTypeStrList)
            {
                Button aBtn = new Button();
                aBtn.Content = aStrType;
                aBtn.Height = 20;
                Font f = new Font("SimSun", 7F, System.Drawing.FontStyle.Regular);
                System.Drawing.Size aSize = System.Windows.Forms.TextRenderer.MeasureText(aStrType, f); //获得字符在控件中显示的尺寸
                aBtn.Width = aSize.Width + 20;
                aBtn.HorizontalAlignment = HorizontalAlignment.Left;
                rCanvas.Children.Add(aBtn);
                if (aLocationX + aBtn.Width > rCanvas.RenderSize.Width)
                {
                    aLocationY += 25;
                    aLocationX = 0;
                }
                Canvas.SetLeft(aBtn, aLocationX); //设置按钮在容器中的位置
                Canvas.SetTop(aBtn, aLocationY);
                aLocationX += (int)aBtn.Width + 10;
            }
        }

加入测试代码:

       private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            List<string> aStrList = new List<string>();
            aStrList.Add("Canvas");
            aStrList.Add("RenderSize");
            aStrList.Add("SetResourceReference");
            aStrList.Add("TextRenderer.MeasureText");
            aStrList.Add("学习");
            aStrList.Add("WPF博大精深");
            aStrList.Add("button自动布局");
            aStrList.Add("button自动大小");
            aStrList.Add("字符串");
            AddCanvasControl(aStrList);
        }

效果如下:
这里写图片描述

第一次发博文,希望大家多多鼓励。以后我会在优快云上多发博文,多与大家交流经验,让自己技术成长得更快。

【WPF应用15】WPF中的Canvas控件:功能、使用方法和应用示例 WPF中的Canvas控件:功能、使用方法和应用示例 阅读详情

相关推荐

WPF基础:在Canvas上绘制图形

本文介绍了在WPF中如何在Canvas上绘制图形。

mingupup的博客 3687

WPF/Silverlight为什么要使用Canvas.SetLeft()这样的方法?

WPF/Silverlight为什么要使用Canvas.SetLeft()这样的方法? 看见园子里有兄弟在讨论到关于WPF/SL中的属性的问题,比如:“为啥flex可以直接对控件的left,top这些属性直接操作,sl还要转一下。这个很难理解,难道是因为dp的好用?相对dp的使用flex的实现简单明了的多了”正好我最近在研究WPF,在这儿说说我的看法。可能大家大多就是在用WPF或者SL

pnuts的专栏 920

WPF 中Canvas图像缩放和平移

图像上放一个图元,同时实现缩放和平移操作 缩放操作:使用滚轮实现缩放,缩放原点以鼠标为中心 平移操作:按住鼠标右键,随鼠标平移 缩放和平移时图元和图像的相对位置不变

qq_34552942的博客 1941

WPF 入门教程Canvas布局

正确的布局和定位是交互式、高性能和用户友好的Windows应用程序的重要组成部分。本系列文章解释了WPF中的布局过程。本系列文章首先了解WPF布局过程。本系列的下一部分将介绍布局和定位的基础知识,例如元素的大小、空白、填充和对齐方式。在本系列的后面,我将介绍WPF中可用的各种面板和相关的父控件。 本文将详细讨论Canvas面板。 Canvas面板用于使用相对于画布区域的坐标来定位子元素。以下是 Canvas 面板的一些属性。 Canvas 的 Height 和 Width 属性的默认值为 0。如果不设

软件技术的专栏 5065

Canvas绘制控件——关于Python的tkinter模块Canvas控件绘制组件的一些问题(scrollregien):画布的滚动超出预定范围

self.cv.configure(scrollregion=(0,0,self.frm.winfo_width(),self.frm.winfo_height())) #将cv的滚动范围设为frm的大小。self.cv.configure(scrollregion=(0,0,self.frm.winfo_width(),self.frm.winfo_height())) #将cv的滚动范围设为frm的大小。我们可以发现,在frm的高度小于cv的高度时,图中cv的滚动向上超过了设置的范围。

2501_90225911的博客 834

【愚公系列】2023年10月 WPF控件专题 Canvas控件详解

WPF控件是Windows Presentation Foundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见的标准用户界面元素。自定义控件则允许开发人员使用XAML和C#等编程语言来创建个性化的用户界面元素。自定义控件可以根据需求提供更多的功能和自定义化选项,以及更好的用户体验。

愚公智库 5万+

Unity3d UI控件相对于Canvas坐标

UI控件位置转换 获得GameObject控件及其子控件相对于Canvas的坐标,需要使用以下函数 //将屏幕空间点转换为位于矩形平面上的RectTransform的局部空间中的位置。 //rect参数是是想要获取的相对控件的坐标,即Canvas控件 //screenPoint参数是控件世界坐标转换为屏幕坐标 //cam参数是与Canvas相关联的摄像机。 //对于画布中的RectTransform设置为Screen Space - Overlay模式,cam参数应该为null。 //当从提供Pointer

wangningzk123的博客 2512

大白话讲解Numpy中什么是一维、二维、三维数组,以及5种创建方式

NumPy中提供了多种创建数组的方式,其中最基本的方式就是通过array()函数创建数组在使用该函数时直接传入列表或元组即可。 通过array()函数分别创建一维数组、二维组和三维数组,那么什么是维度呢?一维、二维、三维有什么区别? 1、什么是维度? 维度可以理解为描述数据的一种 “方向” 或者 “层次”。在数组中,维度的数量决定了我们需要用多少个索引来访问一个元素 2、一维、二维、三维的区别? (1)一维:一维数组就像是一条直线上排列的一组数据,例如: a = np.array([1, 2

1362

C# wpf 实现Canvas内控件拖动

前言 有一些业务场景中我们需要拖动控件,上一篇文章《C# wpf 实现Grid内控件拖动》在Grid中实现的控件拖动,在Canvas中也可以实现控件拖动,通过设置Canvas的附加属性即可,根据鼠标的移动,设置相应Canvas的Left、Top。 一、如何实现? 1.注册鼠标事件 拖动的控件需要注册3个鼠标事件分别是,鼠标按下、鼠标移动、鼠标弹起。 以Button为例: <Button PreviewMouseDown="Button_MouseDown" PreviewM

codeofcc的博客 7112

PaddleOCR转ONNX模型实战:5分钟搞定中文OCR推理部署(附完整代码)

本文详细介绍了将PaddleOCR模型转换为ONNX格式并进行高效推理部署的完整实战方案。通过Paddle2ONNX工具实现模型转换,利用ONNX Runtime构建跨平台推理引擎,涵盖环境配置、模型优化、批量处理及多平台部署等关键步骤,显著提升中文OCR在边缘设备上的推理性能。

weixin_29051811的博客 616

vmware vsphere5---部署vCSA(VMware vCenter Server)附带第二阶段安装报错解决方案

因为这份文档我是边做边写的,遇到问题重新装了好几次所以IP会很乱ESXI主机为192.168.20.10VCSA为192.168.20.7,后台为192.168.20.7:5480后期请自行对应,后面的192.168.20.57请对应192.168.20.7,或根据自己的来。

m0_70212665的博客 5714

WPF获取控件位置的方法

WPF中提供了多种布局方式,因此在布局中的定位相对于WinForm的绝对定位要灵活的多,在WPF中,控件均没有如WinForm中的Location属性,但是,对应的提供了各种设定与获取相对于承载元素的定位     一般来说,Wpf中的布局控件大多都是相对定位(网格,流式,面板等),如果我们要改变控件在布局中的位置可以用Margin,Padding等类似HTML中的方式,虽然说这种方式在W

1万+

PCIe链路训练Recovery状态机:从RcvrLock到链路稳定的关键路径

本文深入解析PCIe链路训练中的Recovery状态机,特别是RcvrLock状态的关键作用。从Block对齐、均衡预设值应用到状态转移条件,详细介绍了确保链路稳定的技术要点,并提供了高速率下的特殊处理方法和常见问题排查指南,帮助工程师解决PCIe链路不稳定问题。

weixin_28739079的博客 175

LVGL『Canvas画布控件』介绍

一. LVGL GUI画布控件的概念 画布继承自图像,用户可以在其中绘制任何内容。可以使用 lvgl 的绘图引擎在此处绘制矩形,文本,图像,圆弧。除了一些“效果”,还可以应用,例如旋转,缩放和模糊。 二. LVGL GUI画布小部件和样式 画布的主要部分称为 LV_CANVAS_PART_MAIN ,只有 image_recolor 属性用于为LV_IMG_CF_ALPHA_1/2/4/8BIT 图像赋予颜色。 三. LVGL GU画布控件的使用 1. 缓冲(Buffer) 画布需要一个缓冲区来

朝气蓬勃 1万+

【硬件开源实战】STM32G070RBT6开发板从设计到避坑全解析

本文全面解析了STM32G070RBT6开发板从硬件设计到避坑的实战经验。详细介绍了电源设计、时钟电路、PCB布局等关键环节,分享了成本控制、焊接测试、软件开发和外设驱动的实用技巧,帮助开发者高效完成项目开发。

weixin_26897585的博客 236

医学图像分割评价指标详解:从Dice到MSD的实战解析

本文深入解析医学图像分割的核心评价指标,从最常用的Dice相似系数到衡量边界精度的MSD(最大对称表面距离),通过实战案例与代码演示,系统阐述各指标的计算原理、应用场景及临床意义,帮助读者全面评估模型性能。

weixin_29070721的博客 593

WPF中通过代码设置控件的坐标

用WPF做贪吃蛇小游戏时,发现了一个问题: 贪吃蛇的移动,我是通过不断刷新Rectangle来实现(贪吃蛇的身体由一组Rectangle组成),因此需要不断调整Rectangle的坐标,但是WPF中没有Location的相关设置 在网上查到可以用Thickness实现 Rectangle Rec = new Rectangle(); Rec.Margin = new Thic...

1171

RK3588 开启多窗口

这样就支持多窗口了。

tzj1058756809的博客 267

WPF 布局控件 之 Canvas

Canvas: Canvas比较简单,只是一个存储元素的容器, 它不会自动调整内部元素的排列及大小。 不指定元素位置,元素将默认显示在画布的左上方。 Canvas的主要用途是用来画图。 Canvas默认不会自动裁减超过自身范围的内容,即溢出的内容会显示在Canvas外面,这是因为默认 ClipToBounds="False";我们可以通过设置ClipToBounds="True来裁剪多出

水镜 2271

【OpenClaw企业级智能体实战】第04篇:OpenClaw成本优化实战——Token消耗降96%!claude-mem+OpenViking从入门到精通

OpenClaw作为企业级智能体框架,凭借强大的自动化能力成为企业数字化转型的热门工具,但原生机制导致的上下文冗余问题,让众多用户面临“Token消耗失控”的困境——单周账单数千元的案例屡见不鲜。本文基于阿里云实测数据与开源工具官方文档,先深度拆解OpenClaw成本黑洞的核心成因(记忆碎片化、Token指数级膨胀),再系统讲解两款核心优化工具(claude-mem单Agent记忆管理、OpenViking多Agent集群底座)的底层原理、算法架构与实现逻辑,提供从环境搭建、工具集成、参数调优到安全部署

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 703

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

unity panel如何设置控件位置_Unity--互动组件(DropDown )

该组件可以用来让用户选择选项列表中一个选项。控件显示当前选择的选项。单击后,它会打开选​​项列表,因此可以选择一个新选项。选择新选项后,列表将再次关闭,并且控件将显示新选择的选项。如果用户单击控件本身或“画布”中的其他任何位置,该列表也将关闭。此组件中的,交互,过渡,导航与文章(Unity--互动组件(Button))中的介绍如同;Template:(模板)下拉列表模板的Rect转换Caption...

weixin_39946364的博客 648

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

WPF 面板控件:Canvas控件

WPF Canvas控件

m0_58717895的博客 1417

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

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

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

WPF Canvas在Xaml和C#中设置控件的坐标

1.在xaml中设置控件坐标 <Canvas x:Name="printArea" Width="680" Height="280" Margin="90,80" Background="Blue"> <Label Content="文本框:" Canvas.Left="10.9" Canvas.Top="20.39" Width="80" Height="30" FontSize="12" Foreground="Black"/> </Canvas> 这种

qq_26814543的博客 1899
下一篇: TextRenderer.MeasureText计算字符串文本所占的尺寸
梦想小白菜
博客等级 码龄12年 27粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值