2013-02-12 5 views
3

У меня есть WrapPanel, содержащий произвольное количество элементов с неровным размером. Я хотел бы использовать функцию перетаскивания для моих элементов.WPF ударил тест прямоугольной области

Кажется довольно очевидным, как HitTest для точки, но как я могу найти все предметы в прямоугольной области?

ответ

4

Вы можете использовать VisualTreeHelper.HitTest с GeometryHitTestParameters аргументом и HitTestFilterCallback, который проверяет, если визуал является прямым потомком панели.

Что-то вроде этого:

var selectedElements = new List<DependencyObject>(); 

var rect = new RectangleGeometry(...); 
var hitTestParams = new GeometryHitTestParameters(rect); 

var resultCallback = new HitTestResultCallback(
    result => HitTestResultBehavior.Continue); 

var filterCallback = new HitTestFilterCallback(
    element => 
    { 
     if (VisualTreeHelper.GetParent(element) == panel) 
     { 
      selectedElements.Add(element); 
     } 
     return HitTestFilterBehavior.Continue; 
    }); 

VisualTreeHelper.HitTest(
    panel, filterCallback, resultCallback, hitTestParams); 

Это выглядит немного сложнее, но HitTestFilterCallback необходимо, чтобы получить все визуальные эффекты в визуальном дереве, а не только те, которые на самом деле попал. Например, если ваша панель содержит элементы управления Label, HitTestResultCallback будет вызываться только для детей Border и TextBlock. Визуальные изображения каждой метки.

-1

Опция для контроля видимости хитов - это свойство IsHitTestVisible. Это свойство позволяет вам контролировать видимость тестового теста независимо от кисти, с которой визуализируется UIElement.

Кроме того, Вы хотите установить заливку в прозрачный

<Rectangle Width="200" Height="200" Margin="170,23,12,35" Fill="Transparent" IsHitTestVisible="True" /> 
Смежные вопросы