原文: WPF如何得到一個在使用者控件内部的元素的坐标位置 例如有這樣一個使用者控件:
<UserControl d:DesignHeight="100" d:DesignWidth="200" ...>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="100" />
</Grid.ColumnDefinitions>
<Ellipse Name="leftEllipse" Grid.Column="0" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="Red" />
<Ellipse Name="rightEllipse" Grid.Column="1" Width="50" Height="50" HorizontalAlignment="Center" VerticalAlignment="Center" Fill="Green" />
</Grid>
</UserControl>
這是主視窗:
<Window ...>
<Canvas Name="canvas1">
<my:MyUserControl x:Name="myUserControl1" Width="200" Height="100" Canvas.Top="100" Canvas.Left="100" />
</Canvas>
</Window>
我們知道,可以通過下面的方法得到使用者控件本身的坐标位置:
double x = Canvas.GetLeft(myUserControl1);
那麼如何得到使用者控件内部的元素的坐标呢?要知道,當使用者控件本身應用了變換(如:RotateTransform),其内部元素的坐标是會改變的。
解決這個問題有兩個方法:
//方法1:
在使用者控件中編寫方法:
public GeneralTransform LeftEllipseTransform(UIElement e)
{
return leftEllipse.TransformToAncestor(e);
}
在主視窗中調用:
var p = myUserControl1.LeftEllipseTransform(canvas1).Transform(new Point()); //得到左圓的左上角坐标
//方法2:
public Point GetLeftEllipsePosition(Point p, UIElement e)
{
return leftEllipse.TranslatePoint(p, e);
}
var p = myUserControl1.GetLeftEllipsePosition(new Point(), canvas1); //得到左圓的左上角坐标
或者,如果要得到左圓的圓心位置的話,就這樣調用:
var p = myUserControl1.GetLeftEllipsePosition(new Point(25, 25), canvas1); //得到左圓的圓心坐标