curson在clickevent中的位置

时间:2018-08-10 10:42:20

标签: c# winforms

我想获取执行点击事件的控件的位置

为此,我尝试了以下代码

Xpos = Cursor.Position.X;
Ypos = Cursor.Position.Y;

但是这给出了光标的当前位置。然后我尝试了以下代码

MouseEventArgs m = (MouseEventArgs)e;
Xpos=m.X;
Ypos=m.Y;

但此位置不是相对于整个屏幕。

如何获取执行点击事件的控件位置?

修改

作为为重复项提供的链接,它提供执行点击操作的点的位置,而没有提供执行点击操作的控件的位置。

3 个答案:

答案 0 :(得分:0)

您可以试试吗?它应该返回您期望的值(单击控件的左上角)。

XAML:

<TextBlock Text="Sample" Width="100" Height="50" 
           MouseLeftButtonDown="TextBlock_MouseLeftButtonDown"/>

XAML.cs

private void TextBlock_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
    var control = sender as FrameworkElement;
    var positionToScreen = control.PointToScreen(new Point(0, 0));
}

答案 1 :(得分:0)

如果您的项目位于WindowsFormApplicaiton中,则

如果您的控件像屏幕截图一样button

enter image description here

然后,您还可以在其主屏幕和表单屏幕中访问其位置

下面是代码

private void button1_Click(object sender, EventArgs e)
{
    //This code gives you the location of button1 wrt your primary working screen
    Point location = this.PointToScreen(button1.Location);
    int x1 = location.X;
    int y1 = location.Y;

    MessageBox.Show($"X: {x1}, Y: {y1}");


    //This code gives you the location of button1 wrt your forms upper-left corner        
    Point relativeLoc = new Point(location.X - this.Location.X, location.Y - this.Location.Y);
    int x2 = relativeLoc.X;
    int y2 = relativeLoc.Y;

    MessageBox.Show($"X: {x2}, Y: {y2}");


    //This code gives you the location of button1 wrt your forms client area
    Point relativeLoc1 = new Point(button1.Location.X, button1.Location.Y);
    int x3 = relativeLoc1.X;
    int y3 = relativeLoc1.Y;

    MessageBox.Show($"X: {x3}, Y: {y3}");
}

在上面的代码中,我使用了this,您可以根据需要使用任何forms对象

编辑:

如果您不知道控件的单击位置,则必须在

之类的表单中为所有控件注册一个事件。

在下面的代码中,我使用了MouseHover事件,但是您可以根据需要使用任何事件

首先为MouseHover内部的所有控件注册Form1_Load事件,例如

private void Form1_Load(object sender, EventArgs e)
{
    foreach (Control c in this.Controls)
        c.MouseHover += myMouseHoverEvent;
}

那么您的自定义MouseHover事件是

private void myMouseHoverEvent(object sender, EventArgs e)
{
    Control control = sender as Control;

    int x = control.Location.X;
    int y = control.Location.Y;

    MessageBox.Show($"X: {x}, Y: {y}");
}

尝试一次可能对您有帮助

答案 2 :(得分:0)

如果让此事件处理程序处理您感兴趣的所有控件的MouseClick事件,此代码应该可以解决您的问题。 如果要将位置包括在单击的控件内。然后添加鼠标事件args中的位置(代码中的Se注释)。

private void control_MouseClick(object sender, MouseEventArgs e)
{
        Control control = sender as Control;
        int posX = control.Location.X;
        int posY = control.Location.Y;
        //Add e.X respectivly e.Y if you want to add the mouse position within the control that generated the event.

        while (control.Parent != null)
        {
            control = control.Parent;
            posX += control.Location.X;
            posY += control.Location.Y;
        }

        ((Label)sender).Text = "X: " + posX + " Y: " + posY;
}