天天看點

WPF如何得到一個在使用者控件内部的元素的坐标位置

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