如何知道鼠标在画布上单击了哪个控件?

发布于 2024-11-28 21:39:56 字数 278 浏览 0 评论 0原文

我正在创建一个 C# WPF 应用程序,并寻找一种方法来执行以下操作:

我有一个画布,其中包含不同的用户控件和一个按钮。

当我单击按钮时,光标变为一只手(Canvas.Cursor = Cursors.Hand)

然后,如果我单击其中一个控件,我会收到一个消息框,显示单击的控件的名称(该名称是控制)。

如果我单击其他地方,光标将重置,我应该再次单击该按钮,然后才能再次获取名称。

我尝试使用事件和处理程序,但无法实现我想要的。

非常感谢你的帮助

I am creating a C# WPF application and looking for a way to do the following:

I have a canvas with different user controls in it and a button.

When I click on the button the cursor change to a hand (Canvas.Cursor = Cursors.Hand)

Then if I click on one of the controls I get a message box showing the name of the control clicked (the name is a public property of the control).

If I click somewhere else i the cursor resets and I should click on the button again before I can get the name again.

I tried playing with events and handlers but couldn't achieve what I wanted.

Thank you very much for you help

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

祁梦 2024-12-05 21:39:56

您可以使用 Canvas.MouseDown 并使用 VisualTreeHelper.HitTest() 和鼠标按下事件参数的 GetPosition() 来获取之前的元素点击。

<Canvas Name="myCanvas" MouseDown="MouseDownHandler" />

public void MouseDownHandler(object sender, MouseButtonEventArgs e)
{
    HitTestResult target = VisualTreeHelper.HitTest(myCanvas, e.GetPosition(myCanvas));

    while(!(target is Control) && (target != null))
    {
        target = VisualTreeHelper.GetParent(target);
    }
    // now if target is not null, it's the control that was clicked...
}

然后,您可以使用VisualTreeHelper.GetParent()(在while循环中)来获取被单击的控件。

You can use Canvas.MouseDown and use VisualTreeHelper.HitTest() with GetPosition() of the mouse down event args to get the element that was clicked.

<Canvas Name="myCanvas" MouseDown="MouseDownHandler" />

public void MouseDownHandler(object sender, MouseButtonEventArgs e)
{
    HitTestResult target = VisualTreeHelper.HitTest(myCanvas, e.GetPosition(myCanvas));

    while(!(target is Control) && (target != null))
    {
        target = VisualTreeHelper.GetParent(target);
    }
    // now if target is not null, it's the control that was clicked...
}

Then you can use VisualTreeHelper.GetParent() (in a while loop) to get the control that was clicked.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文