恩庭 黄
恩庭 黄

Reputation: 1

How to get a element's position which in a UserControl

I have a UserControl:

<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>

Here is my MainWindow:

<Window ...>
    <Canvas Name="canvas1">
        <my:MyUserControl x:Name="myUserControl1" Width="200" Height="100" Canvas.Top="100" Canvas.Left="100" />
    </Canvas>
</Window>

I know how to get the position of myUserControl1 :

double x = Canvas.GetLeft(myUserControl1);

But can anyone tell me how to get the position of myUserControl1.leftEllipse? And when myUserControl1 apply a RotateTransform, the myUserControl1.leftEllipse's position will changed, won't it?

Upvotes: 0

Views: 237

Answers (1)

Clemens
Clemens

Reputation: 128013

Without making the generated leftEllipse field public, you could add a method to the UserControl that returns a transform object from the Ellipse's coordinates to that of an ancestor element, e.g.

public GeneralTransform LeftEllipseTransform(UIElement e)
{
    return leftEllipse.TransformToAncestor(e);
}

You may then call it in your MainWindow like this:

var p = myUserControl1.LeftEllipseTransform(this).Transform(new Point());

Instead of TransformToAncestor (or TransformToVisual) you may also use TranslatePoint.

public Point GetLeftEllipsePosition(Point p, UIElement e)
{
    return leftEllipse.TranslatePoint(p, e);
}

In MainWindow:

var p = myUserControl1.GetLeftEllipsePosition(new Point(), this);

Or for the center of the Ellipse (instead of its upper left corner):

var p = myUserControl1.GetLeftEllipsePosition(new Point(25, 25), this);

Upvotes: 1

Related Questions