Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何知道鼠标在画布中单击了什么控件?_C#_Wpf_Canvas_Wpf Controls_Mouseevent - Fatal编程技术网

C# 如何知道鼠标在画布中单击了什么控件?

C# 如何知道鼠标在画布中单击了什么控件?,c#,wpf,canvas,wpf-controls,mouseevent,C#,Wpf,Canvas,Wpf Controls,Mouseevent,我正在创建一个C#WPF应用程序,并寻找一种方法来执行以下操作: 我有一个画布,里面有不同的用户控件和一个按钮 当我单击按钮时,光标变为手(Canvas.cursor=Cursors.hand) 然后,如果我单击其中一个控件,我会看到一个消息框,显示所单击控件的名称(该名称是该控件的公共属性) 如果我单击其他地方,光标将重置,我应该在再次获取名称之前再次单击按钮 我尝试使用事件和处理程序,但无法实现我想要的 非常感谢您的帮助您可以使用Canvas.MouseDown并使用visualtreehe

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

我有一个画布,里面有不同的用户控件和一个按钮

当我单击按钮时,光标变为手(Canvas.cursor=Cursors.hand)

然后,如果我单击其中一个控件,我会看到一个消息框,显示所单击控件的名称(该名称是该控件的公共属性)

如果我单击其他地方,光标将重置,我应该在再次获取名称之前再次单击按钮

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


非常感谢您的帮助

您可以使用
Canvas.MouseDown
并使用
visualtreeheloper.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...
}

public void MouseDownHandler(对象发送器,MouseButtonEventArgs e)
{
HitTestResult target=VisualTreeHelper.HitTest(myCanvas,e.GetPosition(myCanvas));
而(!(目标为控制)和(&(目标!=null))
{
target=VisualTreeHelper.GetParent(目标);
}
//现在,如果目标不为null,则是单击的控件。。。
}

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

如果您尝试使用事件和处理程序,但无法实现所需的功能,那么您可能玩的时间不够长……您可以展示您所尝试的功能,也许我们可以帮助您消除bug。谢谢。VisualTreeHelper正是我所寻找的:)谁会在不给出解释的情况下否决一个答案?我很困惑。。。
<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...
}