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);  //得到左圆的圆心坐标
posted @ 2018-05-03 10:47 Fixing 阅读(...) 评论(...) 编辑 收藏