我有一个 WrapPanel,其中包含任意数量的锯齿状大小的元素。我想为我的项目实现拖动选择。
如何对一个点进行 HitTest 似乎很明显,但如何找到矩形区域内的所有项目?
您可以使用VisualTreeHelper.HitTest http://msdn.microsoft.com/en-us/library/ms608753.aspx with a 几何命中测试参数 http://msdn.microsoft.com/en-us/library/system.windows.media.geometryhittestparameters.aspx论证和一个命中测试过滤器回调 http://msdn.microsoft.com/en-us/library/system.windows.media.hittestfiltercallback.aspx检查视觉对象是否是面板的直接子代。
像这样的事情:
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
有必要获取视觉树中的所有视觉对象,而不仅仅是那些实际被击中的视觉对象。例如,如果您的面板包含标签控件,则HitTestResultCallback
只会为每个标签的 Border 和 TextBlock 子视觉对象调用。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)