如何在XAML中定义一个矩形并使用IntersectsWith方法?

6

我有一个 XAML 中的矩形:

<Rectangle x:Name="MyRectangle" Height="300" Width="300"></Rectangle>

我想检查它是否与另一个矩形相交。在这个SO问题中,他们说必须使用IntersectsWith方法。 但是我无法在代码后台中使用它。当我用C#编写时:

MyRectangle.IntersectsWith(

我收到了标准错误信息:

"System.Windows.Shapes.Rectangle没有包含'IntersectsWith'的定义,也不存在扩展方法[...]"

我认为这是因为XAML中的矩形是System.Windows.Shapes.Rectangle,而该方法适用于System.Windows.Rect。如果是这样的话,有没有一种方法可以将我的Rectangle转换成Rect

3个回答

4
这是我最终使用的解决方案。 对于每个要测试是否与其他元素相交的元素,我创建一个包含它的矩形。因此,我可以使用IntersectsWith方法。
例如(使用矩形,但您也可以使用其他图形、UserControls等): XAML
<Canvas>
    <Rectangle x:Name="Rectangle1" Height="100" Width="100"/>
    <Rectangle x:Name="Rectangle2" Height="100" Width="100" Canvas.Left="50"/>
</Canvas>

C#

Rect rect1 = new Rect(Canvas.GetLeft(Rectangle1), Canvas.GetTop(Rectangle1), Rectangle1.Width, Rectangle1.Height);
Rect rect2 = new Rect(Canvas.GetLeft(Rectangle2), Canvas.GetTop(Rectangle2), Rectangle2.Width, Rectangle2.Height);
if(rect1.IntersectsWith(r2))
{
    // The two elements overlap
}

1
尝试一下
MyRectangle.RenderedGeometry.Bounds.IntersectsWith();

嗨!谢谢您的回复。我尝试了您的建议,但无法使其工作。我在画布上重叠了两个矩形,但当我写下以下代码时:if(Rect1.RenderedGeometry.Bounds.IntersectsWith(Rect2.RenderedGeometry.Bounds))该条件并不成立。 - Michaël Polla

1
你可以使用VisualTreeHelper.HitTest进行相交测试,不要忘记设置GeometryHitTestParametersWindows Presentation Foundation (WPF) 的命中测试只在命中测试期间考虑到几何图形的填充区域。如果你创建了一个点几何图形,则命中测试不会与任何内容相交,因为点没有面积。

嗨!谢谢你的帮助。我几乎找到了一个可行的解决方案,特别是在GeometryHitTestParameters文档提供的示例的帮助下,但与此同时,我找到了另一个对我来说更容易编写和理解的解决方案 :) - Michaël Polla
1
@MichaëlPolla 欢迎 :), 没有单一正确的解决方案,如果 IntersectsWith 解决了问题,那么你走在了正确的道路上 :) 你可以接受自己的答案 ;) 没有任何不愉快的感觉。 - makc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接