У меня есть метки внутри холста, мне нужно получить метку, которая пересекается с координатами X, Y?
Спасибо!!
У меня есть метки внутри холста, мне нужно получить метку, которая пересекается с координатами X, Y?
Спасибо!!
Canvas.GetLeft(element), Canvas.GetTop(element) даст вам позицию любого элемента. Используйте ActualWidth и ActualHeight, чтобы сформировать полный прямоугольник. Вы можете перебирать Children of the Canvas с помощью foreach.
Редактировать: CodeNaked указал, что элементы могут быть установлены с помощью SetRight или SetBottom, поэтому я изменил пример кода:
foreach (FrameworkElement nextElement in myCanvas.Children)
{
double left = Canvas.GetLeft(nextElement);
double top = Canvas.GetTop(nextElement);
double right = Canvas.GetRight(nextElement);
double bottom = Canvas.GetBottom(nextElement);
if (double.IsNaN(left))
{
if (double.IsNaN(right) == false)
left = right - nextElement.ActualWidth;
else
continue;
}
if (double.IsNaN(top))
{
if (double.IsNaN(bottom) == false)
top = bottom - nextElement.ActualHeight;
else
continue;
}
Rect eleRect = new Rect(left, top, nextElement.ActualWidth, nextElement.ActualHeight);
if (myXY.X >= eleRect.X && myXY.Y >= eleRect.Y && myXY.X <= eleRect.Right && myXY.Y <= eleRect.Bottom)
{
// Add to intersects list
}
}
Просто используйте InputHitTest
на своем холсте, передав координата, которую вы хотите в качестве параметра. Обратите внимание, что InputHitTest
доступен на каждом UIElement
и не зависит от холста.
VisualTreeHelper.HitTest()
должно помочь в этом, но имеет другую проблему. , он фактически пропустит метки в тесте на попадание. Решение, которое я нашел (которое заняло большую часть моего времени), состоит в том, чтобы выполнить поиск визуального дерева самостоятельно.
- person Jeff Mercado; 22.07.2011