给定WPF控件的当前坐标

时间:2010-09-07 21:45:06

标签: c# .net wpf

给定一个System.Windows.Controls.Control,如何找到控件的左上角和右下角(以像素为单位)?另外,我怎样才能设置上述角落?我想根据当前的位置任意调整大小或移动控件。我在C#。

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用TransformToVisual获取Visual相对于另一个Visual的位置。例如,如果child是您的控件,而parent是父级,例如Window:

 var point = child.TransformToVisual(parent).Transform(new Point(0, 0));

您可以使用ActualHeightActualWidth来获取尺寸,然后您可以通过将其添加到该位置来计算出底部和右侧。

控件的位置由WPF Layout System设置,因此您无法在所有情况下设置位置。如果您希望能够更改它,请将您的控件设为Canvas的孩子,并设置附加的Canvas.TopCanvas.Left属性:

Canvas.SetLeft(child, 123);
Canvas.SetTop(child, 456);

更新:正如Anvaka指出的那样,有一些方法可以设置元素的位置,即使它不在Canvas中。一个是设置Margin。元素将向下移动Margin.Top,向右移动Margin.Left(尽管它也会变小)。您甚至可以将边距的组件设置为负值,以使元素在任何一侧溢出其容器。

另一种方式是使用RenderTransformLayoutTransform。从文档“LayoutTransform忽略TranslateTransform操作”,但你仍然可以使用RenderTransform:

child.RenderTransform = new TranslateTransform(left, top);

如果您正在设计UI以允许明确定位元素,您可能会发现将Canvas添加到父级并将可移动元素添加到Canvas更容易。

答案 1 :(得分:1)

这取决于您的控件所在的容器。如果您想自由移动它,我假设您拥有Canvas中的控件。

this post中,您会看到如何获得position。使用和高度,您可以通过控件的相应属性获取。 在this post中,您会看到一段移动元素的代码。

您也可以使用Canvas之外的其他容器执行此操作,但这会更棘手,因为您必须处理间接值(边距)。