在Canvas中,我们可以为它的子元素通过附加属性Canvas.Left和Canvas.Top来设置位置,那么子元素和Canvas之间的位置关系也就很清楚了,但是我们需要更一般化的方法,来获得某个子元素相对于桌面,某个父元素等的位置关系,那就需要引入Transform的概念了,也就是通过这个数学化的概念来达到我们想到达的目的。当然除了这个,还有计算的函数,那就是来自Visual的TransformToVisual(Visual visual)方法,在该方法的MSDN文档中有这样一个例子:
XAML代码:
<StackPanel Name="myStackPanel" Margin="8">
<TextBlock Name="myTextBlock" Margin="4" Text="Hello, world" />
</StackPanel>
核心代码:
// Return the general transform for the specified visual object.
GeneralTransform generalTransform1 = myStackPanel.TransformToVisual(myTextBlock);
// Retrieve the point value relative to the child.
Point currentPoint = generalTransform1.Transform(new Point(0, 0));
先说一下这个例子的目的是,求得myStackPanel相对于它的子元素myTextBlock的位置,我们可以猜想,若以myTextBlock的左上角为(0,0),那么算上Margin值,这个相对的位置应该是(-4,-4)。
现在看代码,首先,使用myStackPanel.TransformToVisual获得一个用于封装Transform概念的GeneralTransform对象,这是个抽象的通用类,我们可以看一下它的继承关系:
Object
DispatcherObject (abstract)
DependencyObject
Freezable (abstract)
Animatable (abstract)
GeneralTransform (abstract)
GeneralTransformGroup
Transform (abstract)
TranslateTransform
ScaleTransform
SkewTransform
RotateTransform
MatrixTransform
TransformGroup
我通过断点,发现它返回的是一个MatrixTransform类型,这就好办了,因为它们的内部都含有一个Matrix属性,用来表示Visual的Transform状况,看其中的值,就是{1,0,0,1,-4,-4},其实就是如下的一个矩阵:
|1 0 0|
|0 1 0|
|-4 -4 1|
最后一列是固定的,所以省去,按行展开,就是{1,0,0,1,-4,-4}。我们知道这个3乘以3矩阵的每个元素的作用,最后一行的前两列用于表示位移,那么,用(0,0)乘以这个矩阵后得出的点是哪个点呢(自己算算就明白,其实这里就是平移产生效果),若你懒点,就直接用Transform方法,它会帮助我们得到这个结果,那就是把我们的点Point(0,0)放进去即可,得出的点就是(-4,-4)。
分享到:
相关推荐
C# WPF获取相对坐标 获取子控件相对于父控件的位置
WPF获取DataTemplate里的控件的内容 源代码
WPF获取系统时间,另外还有WPF复杂属性问题,事例:解决渐变色问题
WPF编程时,我们经常使用Mouse.GetPosition(IInputElement relativeTo)或MouseEventArgs.GetPosition(IInputElement relativeTo)来获取鼠标相对于某一界面元素的相对位置,这自然也联想到另外的一个问题:如何获取...
WPF获取默认打印机并打印,获取默认打印机,print_grid 需要打印的Grid,//获取本机上的所有打印机,设置纸张大小
用wpf+visifire实现获取Windows系统内存占用和CPU占用,界面用Visifire.Gauges展现。
WPF使用Mouse.Capture捕获鼠标在屏幕的位置,不需要Hook
wpf 获取本机字体和颜色 wpf 获取本机字体和颜色 wpf 获取本机字体和颜色
通过wpf调用winform类库实现对全屏截取,程序窗体截取,控件截取的操作
获取本地IP信息,项目经常用到 适合新手 推荐!
WPF中Image控件Source属性的相对路径和绝对路径问题的开发经验总结,亲测通过!
wpf界面上 控件拖动,以及控件之间的位置对换
在新开的线程中访问WPF画面元素 在新开的线程中访问WPF画面元素 在新开的线程中访问WPF画面元素
WPF 控件元素绑定简单示例
WPF 软键盘!WPF 软键盘!WPF 软键盘!WPF 软键盘!WPF 软键盘!WPF 软键盘!WPF 软键盘!WPF 软键盘!
wpf binding 的两种方法 数据库连接 并显示的两种方法
这是个WPF写的一个工具,需要NET 4.0,可以获取中央气象台所有的城市代码,并保存成XML,正常情况下可以运行成功,结果应该也正确,如果出现了Exception,请私信联系我
WPF的Expander控件使用方法,可折叠控件的使用方法
WPF高性能绘图的方法,使用WriteableBitmap对象,介绍使用GDI+绘制图形和操作像素的两种方法。
使用Convas.Left(Convas.Right)、Convas.Top(Convas.Bottom)定义与Convas容器的相对位置..... (更多资源:http://cleopard.download.csdn.net/) (福利:http://xuemeilaile.com/) WPF经典教程之WPF体系结构 ...