我有一个WrapPanel包含任意数量的锯齿状大小的元素。我想为我的项目实施拖动选择。
对于一个点来说,HitTest似乎很明显,但是我怎样才能找到矩形区域内的所有项目?
答案 0 :(得分:5)
您可以使用VisualTreeHelper.HitTest GeometryHitTestParameters参数和HitTestFilterCallback来检查Visual是否是Panel的直接子项。
这样的事情:
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
是获取可视树中所有Visual的必要条件,而不仅仅是实际受到攻击的那些。例如,如果您的面板包含Label控件,则只会为每个Label的Border和TextBlock子Visuals调用HitTestResultCallback
。
答案 1 :(得分:-1)
控制命中测试可见性的选项是IsHitTestVisible
属性。无论渲染UIElement的画笔如何,此属性都允许您控制命中测试可见性。
此外,您要将“填充”设置为“Transperent”
<Rectangle Width="200" Height="200" Margin="170,23,12,35" Fill="Transparent" IsHitTestVisible="True" />