解决办法 : 在UserControl中重写HitTestCore方法
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
}
https://www.orcode.com/question/816740_k5367b.html
附上测试代码(封装)
private void GetCurrentElement(Point point)
{
PointHitTestParameters parameters = new PointHitTestParameters(point);
VisualTreeHelper.HitTest(mainGrid, HitTestFilter, HitTestCallback, parameters);
}
/// <summary>
/// 命中测试回调,当命中时执行
/// </summary>
/// <param name="result"></param>
/// <returns></returns>
private HitTestResultBehavior HitTestCallback(HitTestResult result)
{
//此处写处理逻辑
。。。
//当前命中一个之后将不再命中后面的控件,若要继续命中,则设置成Continue
return HitTestResultBehavior.Stop;
}
/// <summary>
/// 命中测试过滤,哪些需要测试哪些不需要测试
/// </summary>
/// <param name="o"></param>
/// <returns></returns>
private HitTestFilterBehavior HitTestFilter(DependencyObject o)
{
Type type = o.GetType();
//设置成只有自定义的控件才能被命中
if (type.FullName.Contains("User.Controls.Test"))
{
return HitTestFilterBehavior.ContinueSkipChildren;
}
else
{
return HitTestFilterBehavior.ContinueSkipSelf;
}
}