2013-07-14 1 views
4

У меня есть этот прямоугольник в XAML:Как использовать метод IntersectsWith с прямоугольником, определенным в XAML

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

Я хочу, чтобы проверить, если она пересекается с другим прямоугольником. В this question on SO говорят, что нужно использовать IntersectsWith method. Но я не могу использовать его в кодировке. Когда я пишу в C#:

MyRectangle.IntersectsWith(

Я получаю стандартную ошибку:

"System.Windows.Shapes.Rectangle does not contain a definition for 'IntersectsWith' and no extension method [...]"

Я думаю, что это потому, что прямоугольник в XAML является System.Windows.Shapes.Rectangle, и метод для System.Windows.Rect? Если да, есть ли способ «преобразовать» мой Rectangle в Rect?

ответ

2

Вот решение, которое я наконец использовал. Для каждого элемента я хочу проверить, пересекается ли он с другими, я создаю Rect, содержащий его. Таким образом, я могу использовать метод 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(); 
+0

Привет! Спасибо за ответ. Я попробовал ваше предложение, но не смог заставить его работать. Я перекрывал два прямоугольника на холсте, но когда я пишу: if (Rect1.RenderedGeometry.Bounds.IntersectsWith (Rect2.RenderedGeometry.Bounds)), условие не является «истинным». –

1

вы можете использовать VisualTreeHelper.HitTest для проверки пересечения, не забудьте установить GeometryHitTestParameters

Windows Presentation Foundation (WPF) hit testing only considers the filled area of a geometry during a hit test. If you create a point Geometry, the hit test would not intersect anything because a point has no area.

+0

Привет! Спасибо за вашу помощь. Я почти смог найти рабочее решение, особенно с примером, представленным в документации GeometryHitTestParameters, но тем временем я нашел другое решение, которое мне было легче писать и понимать :) –

+1

@ MichaëlPolla приветствуется :), нет ни одного права решение, если IntersectsWith решает проблему, то вы на правильном пути :) вы можете принять свой собственный ответ;) нет твердых чувств – makc