如何在UserControl中获取元素的位置

时间:2018-05-02 03:04:49

标签: wpf

我有一个UserControl:

#include <iostream>
#include <math.h>
using namespace std;

int check() {
    long int bin;
    cout<<"Enter the binary number : ";
    cin>>bin;
    long int temp=bin;int len,t,sum=0;
    while(temp!=0) {
        temp=temp/10;
        len++;
    }
    temp=bin;
    for(int i=0;i<len;i++) {
        if(temp%10==0 || temp%10==1)
            temp=temp/10;
        else
            throw(0);
    }
    temp=bin;
    for(int i=0;i<len;i++) {
        t=temp%10;
        sum+=t*pow(2,i);
        temp=temp/10;
    }
    cout<<"The decimal equivalent is "<<sum<<"."<<endl;
}

int main()
{
    string a[10];int cont;
    a[0]="<--Invalid Input. Please enter proper binary number(0s & 1s).-- 
    >\n";
    try {
        check();
    }
    catch(int e_c) {
        cout<<a[e_c];
        cout<<"To try again press 1 else 0."<<endl;
        cin>>cont;
        if(cont==1) {
            try {
                check();
            }
            catch(int e_c) {
                cout<<"Wrong input!!!\n\nX_Terminating Program._X\n";
            }
        }
    }
    return 0;
}

这是我的MainWindow:

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

我知道如何获取myUserControl1的位置:

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

但有谁能告诉我如何获得myUserControl1.leftEllipse的位置? 当myUserControl1应用RotateTransform时,myUserControl1.leftEllipse的位置会发生变化,不会被激活吗?

1 个答案:

答案 0 :(得分:1)

不将生成的leftEllipse字段设置为public,您可以向UserControl添加一个方法,该方法将Ellipse坐标中的变换对象返回到祖先元素的坐标,例如

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

然后你可以在你的MainWindow中调用它:

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

您也可以使用TranslatePoint代替TransformToAncestor(或TransformToVisual)。

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

在MainWindow中:

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

或者椭圆的中心(而不是左上角):

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