C# Canvas getRight方法返回Nan

C# Canvas getRight方法返回Nan,c#,wpf,canvas,C#,Wpf,Canvas,我有一个矩形,我正试图拖放到画布中。完成拖动后,我想得到左、上、右和下坐标。因此,当我说Canvas.GetRight(dragableThumb)和Canvas.GetBottom(dragableThumb)时,两个值都返回NaN 所以对于右派和底层,我是这样说的,但问题是我得到了错误的值。请帮忙 var right=this.Width-left-dragableThumb.ActualWidth; var bottom=此.Height-top-dragableThumb.ActualH

我有一个矩形,我正试图拖放到画布中。完成拖动后,我想得到左、上、右和下坐标。因此,当我说Canvas.GetRight(dragableThumb)和Canvas.GetBottom(dragableThumb)时,两个值都返回NaN

所以对于右派和底层,我是这样说的,但问题是我得到了错误的值。请帮忙

var right=this.Width-left-dragableThumb.ActualWidth; var bottom=此.Height-top-dragableThumb.ActualHeight

这是完整的代码

xaml:

应该是:

var right = left + dragableThumb.ActualWidth;
var bottom = top + dragableThumb.ActualHeight;
应该是:

var right = left + dragableThumb.ActualWidth;
var bottom = top + dragableThumb.ActualHeight;

Canvas.Left
Canvas.Top
Canvas.Right
Canvas.Bottom
是布局属性,而不是渲染属性。这四个属性用于限制
ui元素的布局
,但不表示布局状态,此行为与
宽度
高度
属性相同


查看上面的代码,如果我们阅读
Width
Height
属性,我们会发现它们都是
double.NaN
。只有读取
实际宽度
实际高度
渲染
属性,才能获得正确的布局状态

Canvas.Left
Canvas.Top
Canvas.Right
Canvas.Bottom
属性相同。您可以使用其他方法获取右侧和底部,例如:

var right=Canvas.GetLeft(dragableThumb)+dragableThumb.ActualWidth;
var bottom=Canvas.GetTop(dragableThumb)+dragableThumb.ActualHeight;
如果您想要一种适用于所有其他情况的方法,可以尝试以下代码:

var bounds = new Rect(
    dragableThumb.TranslatePoint(default, DragableCanvas),
    dragableThumb.TranslatePoint(new Point(dragableThumb.ActualWidth, dragableThumb.ActualHeight), DragableCanvas));
var right = bounds.Right;
var bottom = bounds.Bottom;

顺便说一下,您拼写错误的
dragable
。正确的拼写是
draggable

Canvas.Left
Canvas.Top
Canvas.Right
Canvas.Bottom
是布局属性,而不是渲染属性。这四个属性用于限制
ui元素的布局
,但不表示布局状态,此行为与
宽度
高度
属性相同


查看上面的代码,如果我们阅读
Width
Height
属性,我们会发现它们都是
double.NaN
。只有读取
实际宽度
实际高度
渲染
属性,才能获得正确的布局状态

Canvas.Left
Canvas.Top
Canvas.Right
Canvas.Bottom
属性相同。您可以使用其他方法获取右侧和底部,例如:

var right=Canvas.GetLeft(dragableThumb)+dragableThumb.ActualWidth;
var bottom=Canvas.GetTop(dragableThumb)+dragableThumb.ActualHeight;
如果您想要一种适用于所有其他情况的方法,可以尝试以下代码:

var bounds = new Rect(
    dragableThumb.TranslatePoint(default, DragableCanvas),
    dragableThumb.TranslatePoint(new Point(dragableThumb.ActualWidth, dragableThumb.ActualHeight), DragableCanvas));
var right = bounds.Right;
var bottom = bounds.Bottom;
顺便说一下,您拼写错误的
dragable
。正确的拼写是
draggable