在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中,我们可以获取到子控件相对于其父...
1. **布局系统**:WPF提供了一套强大的布局系统,包括Grid、StackPanel、DockPanel、Canvas等,它们可以根据需要自动调整子元素的位置和大小。例如,Grid布局可以设置列和行的自动伸缩,从而实现控件随界面大小变化...
WPF的XAML(Extensible Application Markup Language)用于定义UI元素和它们的布局,而C#代码则处理与用户的交互逻辑。例如,我们可以创建一个文本框显示城市名,一个按钮用于触发天气查询,以及一个数据显示区域来...
在WPF中,数据绑定允许UI元素自动更新以反映数据源的变化,反之亦然。 在实际应用中,你可能还需要处理异常、关闭数据库连接、实现分页和排序等功能。此外,为了提高性能和用户体验,可以考虑使用...
在之前讨论 ListView 滚动相关需求的文章中(UWP: ListView 中与滚动有关的两个需求的实现)曾经提到了获取元素相对位置的方法,即某元素相对另一元素的位置。现将所有相关方法再作整理,并且包括 UWP 与 WPF 两者的...
访问 blog.csdn.net/rorger 并查找wpf栏目,可以获取更深入的技术指导和示例代码,这对于初学者或者希望提升WPF技能的开发者来说是一份宝贵的资源。 5. **MediaShow 文件**: 压缩包中的 "MediaShow" 文件可能包含...
删除操作与添加类似,需要监听`ListBox`的删除事件,获取选中的元素,并从XML文档中移除: ```csharp private void ListBox_Delete(object sender, RoutedEventArgs e) { var listBox = (ListBox)sender; var ...
Canvas作为WPF的一种布局容器,提供了`GetLeft`和`GetTop`方法,可以获取控件相对于Canvas的左上角坐标。你可以结合依赖属性(Dependency Property)来创建一个属性包装器,当控件的位置改变时,通过依赖属性的通知...
《WPF编程宝典C#2012 第4版2.pdf》可能是该书的电子版本,包含了全书的详细内容,读者可以从中获取关于WPF开发的全方位知识,包括基本概念、高级特性和实战技巧。无论是对WPF感兴趣的初学者还是有经验的开发者,都能...
在本文中,我们将深入探讨如何使用WPF(Windows Presentation Foundation)中的`Path`元素来实现一个基于中国的热区地图。WPF是.NET Framework的一部分,它提供了丰富的用户界面框架,用于构建桌面应用程序。在这个...
4. **控件坐标转换**:由于WPF的坐标系统和控件的相对位置,我们可能需要使用VisualTreeHelper类来获取控件相对于父容器的位置,以便正确计算和设置新位置。 5. **约束拖动边界**:为了防止控件被拖放到界面之外,...
WPF提供了一套完整的控件库,包括按钮、文本框等,这使得开发模拟数字键盘变得相对容易。在WPF中,我们可以利用XAML(Extensible Application Markup Language)来声明性地定义用户界面,XAML是一种XML方言,用于...
WPF 提供了强大的图形和绘图能力,使得实现图片缩放变得相对简单。本文将详细介绍如何在WPF中实现图片的缩放功能,并着重讲解如何在鼠标所点位置进行缩放。 首先,我们需要了解WPF中的Image控件。Image控件是WPF中...
WPF提供了一个强大的UI设计工具和丰富的控件库,使得开发这样的功能变得相对简单。下面将详细介绍如何在WPF中实现这个功能。 首先,我们需要了解WPF中的常见文件操作组件。`OpenFileDialog`控件是WPF用于打开文件...
- 旋转:通过三个触摸点形成一个三角形,根据它们的相对位置来旋转对象。 通过这些基础操作,开发者可以构建出更加复杂的交互逻辑,比如图片编辑、游戏控制等。 总的来说,WPF结合Windows 7的多点触控支持,为...
这涉及到WPF的DataBinding、样式和模板、控件设计等方面的知识,通常需要结合使用ControlTemplate、DataTrigger、Style等元素,以及颜色、字体、边框等视觉元素。 总之,WPF Toolkit中的DataGrid控件为WPF开发者...
在代码-behind中,我们需要处理MouseMove事件,计算出鼠标在原始图像上的相对坐标,并根据这个坐标获取局部图像的放大版本。这里涉及到位图操作,包括位图的裁剪和缩放。 ```csharp private void OriginalImage_...
WPF的`Canvas`控件提供了这样的功能,通过`PointToScreen`和`PointFromScreen`方法可以获取元素在屏幕上的绝对坐标,从而计算出相对位置。 5. **3D视觉效果(3DVisualEffects)**:虽然WPF的2D界面主要处理平面元素...
通过计算鼠标位置与星星的相对位置,我们可以精确地获取用户的评分意图。 6. **可扩展性**: 考虑到可能需要支持半星评分或禁用特定操作,我们可以添加额外的逻辑来处理这些情况。例如,通过添加一个布尔属性来...
在Windows Presentation Foundation(WPF)框架中,"放大镜"是一种常见的用户界面(UI)元素,它为用户提供了一种查看...WPF的强大灵活性使得实现这样的功能变得相对简单,但同时也需要注意性能和用户体验方面的考虑。