PathGeometry FillContains无法按预期工作

时间:2015-03-02 20:00:11

标签: wpf hittest pathgeometry

我有一个简单的矩形PathGeometry,想测试点是否在PathGeometry内。显而易见的方法是致电FillContains,但它并没有按预期工作。还有一个具有tolerance参数的重载函数,但通过将tolerance调整为高值FillContains可能会返回true,但由于给定的容差调用{{1}其他几何上的其他几何也可以返回FillContains

所以我写了这个扩展方法,为这个特定的矩形true设置了正确的FillContains

PathGemoetry

样本的结果:

    public static bool Contains(this PathGeometry geo, Point pt)
    {
        var match = System.Text.RegularExpressions.Regex.Match(geo.Figures.ToString(), @"M(\d*.\d*),(\d*.\d*)L(\d*.\d*),(\d*.\d*) (\d*.\d*),(\d*.\d*) (\d*.\d*),(\d*.\d*)z");

        float ulx = float.Parse(match.Groups[1].Value);
        float uly = float.Parse(match.Groups[2].Value);

        float urx = float.Parse(match.Groups[3].Value);
        float ury = float.Parse(match.Groups[4].Value);

        float lrx = float.Parse(match.Groups[5].Value);
        float lry = float.Parse(match.Groups[6].Value);

        float llx = float.Parse(match.Groups[7].Value);
        float lly = float.Parse(match.Groups[8].Value);

        Rect rect = new Rect(ulx, uly, urx - ulx, lly - uly);

        return rect.Contains(pt);
    }

由于我有很多这样的// Point: {188.981887817383,507.910125732422} // Region: M188.759994506836,501.910003662109L216.580001831055,501.910003662109 216.580001831055,511.910003662109 188.759994506836,511.910003662109z // returns false var test1 = region.FillContains(pt); // returns true var test2 = region.Contains(pt); 个对象,那么有更好的实现,以便更快地进行命中测试,或者在使用PathGemoetry时是否有任何遗漏导致意外结果?

修改

注意到我的FillContains已经应用了一个转换,导致内部不适合。

我使用它来修复它,以绕过命中测试中的PathGeometry

Transform

1 个答案:

答案 0 :(得分:0)

你试过吗

VisualTreeHelper.HitTest(Visual reference,  Point point)

VisualTreeHelper.HitTest

Hit Testing Using Geometry