Вы можете использовать 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. Визуальные изображения каждой метки.