2016-02-19 119 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