欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

WPF如何得到一个在用户控件内部的元素的坐标位置

程序员文章站 2022-10-06 19:21:52
例如有这样一个用户控件: 这是主窗口: 我们知道,可以通过下面的方法得到用户控件本身的坐标位置: double x = Canvas.GetLeft(myUserControl1); 那么如何得到用户控件内部的元素的坐标呢?要知道,当用户控件本身应用了变换(如:RotateTransform),其内 ......

例如有这样一个用户控件:

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