【问题标题】:Positioning UIElement on a Canvas在画布上定位 UIElement
【发布时间】:2010-12-23 23:28:01
【问题描述】:

我有一个画布和一个红色矩形。 Rectangle 实现了 MouseDown 事件处理程序:

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

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

复制红色矩形的WidthHeight 属性并为Border 元素设置它们很简单:

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

但是,经过 2 小时的反复试验,在我看来,复制画布上红色矩形的位置似乎是不可能的!预期:

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)RedRectangle.GetValue(Canvas.Top);

标签: wpf canvas wpf-controls uielement wpf-positioning


【解决方案1】:

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

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

注意,Canvas 永远不会显示 LeftTop 等于 double.NaN 的元素,这是 LeftTop 的默认值。

【讨论】:

  • 西蒙,感谢您的回复。这应该解决Border 的设置器端。但是我应该如何获得红色矩形的 Canvas.LeftCanvas.Top 属性?我上面写的方式总是返回NaN
  • 同样的想法:double left = Canvas.GetLeft(rectangle) 得到矩形的左边。
  • 有两点值得注意:(1)除非Canvas.Left被显式设置,否则它会返回NaN;(2)如果你设置了一个元素的Canvas.Left,它实际上可能不会反映那个设置。举例来说,设置同一元素的Canvas.LeftCanvas.Right,然后打印出Canvas.GetLeft()Canvas.GetRight() 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
相关资源
最近更新 更多