原文:
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); //得到左圆的圆心坐标