1.当鼠标点击时获取鼠标相对于某个控件的坐标point
private void mainGrid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
GetCurrentElement(e.GetPosition(mainGrid));
}
2. 指定point作为参数 用于命中测试的可视化对象,并启动测试
private void GetCurrentElement(Point point)
{
PointHitTestParameters parameters = new PointHitTestParameters(point);
VisualTreeHelper.HitTest(mainGrid, HitTestFilter, HitTestCallback, parameters);
}
3.首先执行命中测试过滤,哪些需要测试哪些不需要测试
private HitTestFilterBehavior HitTestFilter(DependencyObject o)
{
Type type = o.GetType();
//下面写过滤的条件
if (type.FullName.Contains("Coate.Controls.Components"))
{
return HitTestFilterBehavior.ContinueSkipChildren;
}
else
{
return HitTestFilterBehavior.ContinueSkipSelf;
}
}
4.命中测试时,默认是不会命中用户控件,若要命中用户控件需要重写HitTestCore方法
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
return new PointHitTestResult(this, hitTestParameters.HitPoint);
}
5.命中时执行回调函数
private HitTestResultBehavior HitTestCallback(HitTestResult result)
{
//需要做哪些操作写在这儿
this.detail.Content = ((result.VisualHit as ComponentBase).Tag as MonitorDeviceModel).DetailPage;
//当前命中一个之后将不再命中后面的控件,若要继续命中,则设置成Continue
return HitTestResultBehavior.Stop;
}