2016-02-19 82 views
0

我有一个具有椭圆的用户控件。我已将用户控件添加到画布。我试试这个代码来获取相对于椭圆的坐标帆布:无法在画布中获得位置

double left = Canvas.GetLeft(ellipse); 

由于椭圆形,我认为,在画布上的不是直接的成员,我得到NaN的。我已经搜查,发现是这样的:

Point relativePoint = ellipse.TransformToAncestor(canvas).Transform(new Point(0, 0)); 

但是后来我已经awaired的代码仅低于不提供实际坐标,给了我不同的东西。我怎样才能得到实际的坐标?

+0

如果在DependencyObject上设置Canvas.Left,则Canvas.GetLeft可用。如果你没有设置它,你将无法得到它,这就是为什么你会得到NaN。你可以使用解决方案[这里]获得相对于画布的位置(http://stackoverflow.com/a/1923775/4049478) – nkoniishvt

+0

你不应该这样做。使用MVVM。 – user853710

回答

-1

只是不这样做。阅读MVVM上的几篇文章,您将永远不需要问这样的问题

您需要将您的控件绑定到VM。

public class ControlVM 
{ 
    public int X {get;set;} 
    public int Y {get;set;} 
} 

<ItemsControl ItemsSource="{Binding Rectangles}" > 
    ... specify Canvas as the items panel ... 
    <ItemsControl.ItemContainerStyle> 
     <Style> 
      <Setter Property="Canvas.Left" Value="{Binding X}" /> 
      <Setter Property="Canvas.Top" Value="{Binding Y}"/> 
     </Style> 
    </ItemsControl.ItemContainerStyle> 
</ItemsControl> 

如果你这样做,你永远不需要问控制它的坐标,而是代表它的对象。

+0

他的问题是关于视图层,与MVVM无关。 – nkoniishvt

+0

你错了。他应该将对象绑定到控件的x和y位置。如果他甚至试图打出绝对的位置,他大部分时间都会接受NaN作为价值。 MVVM和WPF正在解决DPI问题,因此,您绝对不会使用绝对位置。 – user853710

+0

在大多数情况下,当有人提出这样的问题时,解决问题并不是一个问题,而是他遇到的一个问题,因为他首先是错的。大多数情况下,它是关于定位控件的,因为他不知道如何将控件放置在面板和网格内 – user853710