在画布上定位UI元素

8

我有一个画布和一个放在上面的红色矩形。 矩形 实现了一个 MouseDown 事件处理程序:

private void RedRectangle_MouseDown(object sender, MouseButtonEventArgs e)
{
    CreateMyBorder();
}

CreateMyBorder 方法应该创建一个与画布上的矩形大小和位置相同的 Border UI 元素,即应该覆盖红色矩形。

复制红色矩形的 WidthHeight 属性,并将它们设置为 Border 元素是很容易的:

myBorder.Height = RedRectangle.Height;
myBorder.Width = RedRectangle.Width;

然而,经过两个小时的试错后,我觉得在画布上复制红色矩形的位置似乎不可能!期望的结果:

double x = RedRectangle.GetValue(Canvas.Left);
double y = RedRectangle.GetValue(Canvas.Top);
myBorder.SetValue(Canvas.Left, x);
myBorder.SetValue(Canvas.Top, y);

由于xy变量的值为NaN,所以无法正常工作。为什么?

请帮忙,我简直无法想象获取和设置UIElement在面板上的位置这样微不足道的事情会如此令人烦恼。谢谢。


GetValue 返回的也是一个对象 - 你需要将它转换为 double,例如 (double)RedRectangle.GetValue(Canvas.Top); - Brendan
1个回答

12

你可以使用Canvas上的静态函数:

Canvas.SetLeft(element, x);
Canvas.SetTop(element, y);

注意,Canvas 不会显示左侧或顶部等于 double.NaN 的元素,这是 LeftTop 的默认值。


Simon,谢谢您的回复。这应该解决了Border的setter问题。但是我该如何获取红色矩形的Canvas.LeftCanvas.Top属性?我上面写的方法总是返回NaN - Boris
1
同样的想法:使用Canvas.GetLeft(rectangle)获取矩形的左侧。 - Simon Mourier
值得注意的是两件事情:(1)除非显式设置Canvas.Left,否则它将返回NaN;(2)如果您设置元素的Canvas.Left,它可能实际上并不反映该设置。为了举例说明,设置同一元素的Canvas.LeftCanvas.Right,然后打印出Canvas.GetLeft()Canvas.GetRight()的值。 - Lucas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接