内容简介:新建空白wpf项目,不会,参考上篇文章。知识点1:获得子元素相对于父元素位置和 宽高后台
新建空白wpf项目,不会,参考上篇文章。
知识点1:获得子元素相对于父元素位置和 宽高
<Canvas x:Name="cv"> <Rectangle x:Name="rct" Width="100" Height="80" Fill="#FFD62525" Canvas.Left="309" Canvas.Top="181" /> </Canvas>
后台
private void MainWindow_Loaded(object sender, RoutedEventArgs e) { Rect itemRect = VisualTreeHelper.GetDescendantBounds(rct); Rect itemBounds = rct.TransformToAncestor(cv).TransformBounds(itemRect); Console.WriteLine(itemRect); Console.WriteLine(itemBounds); }
效果:
itemRect是0,0,100,80
我们把canvas换成grid试试
<Grid x:Name="cv"> <Rectangle x:Name="rct" Width="100" Height="80" Fill="#FFD62525" Margin="173,260,919,429" /> </Grid>
如果子元素在滚动条范围内呢
修改前台
<ScrollViewer Width="600" Height="400" x:Name="sv"> <Grid x:Name="cv" Height="800"> <Rectangle x:Name="rct" Width="100" Height="80" Fill="#FFD62525" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="300,500,0,0"/> </Grid> </ScrollViewer>
后台的itemBounds和itemBoundsRelativeScrollViewer是一样的。
我们设置下grid的margin
此时运行效果
和
相对于滚动条的,加上了Grid的Margin的位置
我们理解了怎么求算子元素相对于某个元素的位置,就好办了。
知识点2:矩形区域计算,是否包含。
我们可以通过Rect提供的方法。添加rct2,此时相交的。
Rect itemRect = VisualTreeHelper.GetDescendantBounds(rct); Rect itemBounds = rct.TransformToAncestor(cv).TransformBounds(itemRect); //Rect itemBoundsRelativeScrollViewer = rct.TransformToAncestor(sv).TransformBounds(itemRect); Console.WriteLine(itemRect); Console.WriteLine(itemBounds); //Console.WriteLine(itemBoundsRelativeScrollViewer); Rect itemRect2 = VisualTreeHelper.GetDescendantBounds(rct2); Rect itemBounds2 = rct2.TransformToAncestor(cv).TransformBounds(itemRect2); var _isIntersects = itemBounds.IntersectsWith(itemBounds2); var _isContains = itemBounds.Contains(itemBounds2); Console.WriteLine("_isIntersects="+ _isIntersects+ ",_isContains="+ _isContains);
修改前台
后台不变,输出
所以根据这个,我们能实现 矩形选择框, 命中元素了。 我们把这种选区,英文名单词叫 Rubberband
知识点3,计算自己的中点坐标,然后相对于父元素的坐标。也可以理解相对于父元素的自己的中间坐标
比如一哥 宽11,高7的矩形,中点坐标,是 7,4但是外面如果有个 父元素,那么此时的坐标是多少呢?这就是解决问题的代码,如下
public static Point GetCenterPoint(this FrameworkElement uiElement, UIElement parent) { return uiElement.TransformToAncestor(parent).Transform(new Point(uiElement.Width / 2, uiElement.Height / 2)); }
效果:
我们能求出红色矩形的中心坐标,那么怎么求相对于父容器左上角的坐标呢?
用法如下:
当然这个距离,自己也可以算,矩形的一半+矩形距离左侧的矩形,上面同理,两个和的形成的坐标就是。
====================www.ayjs.net 杨洋 wpfui.com ayui ay aaronyang=======请不要转载谢谢了。=========
推荐您阅读更多有关于“WPF4.5,”的文章
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- AY 一个wpf画图项目复习下【1/10】
- 画图倒不如手绘
- 值得拥有的手绘风格画图工具
- 使用drawio进行画图真的很方便
- 我终于懂得如何使用matplotlib进行画图
- 算法对建筑业的影响,不仅仅是画图
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
C++语言的设计和演化
[美] Bjarne Stroustrup / 裘宗燕 / 机械工业出版社 / 2002-1 / 48.00元
这本书是C++的设计者关于C++语言的最主要著作之一。作者综合性地论述了C++的历史和发展,C++中各种重要机制的本质意义和设计背景,这些机制的基本用途和使用方法,讨论了C++所适合的应用领域及其未来的发展前景。一起来看看 《C++语言的设计和演化》 这本书的介绍吧!