任意の数のギザギザのサイズの要素を含むWrapPanelがあります。アイテムにドラッグセレクトを実装したいのですが。
ポイントをHitTestする方法はかなり明白に思えますが、長方形の領域内のすべてのアイテムを見つけるにはどうすればよいですか?
任意の数のギザギザのサイズの要素を含むWrapPanelがあります。アイテムにドラッグセレクトを実装したいのですが。
ポイントをHitTestする方法はかなり明白に思えますが、長方形の領域内のすべてのアイテムを見つけるにはどうすればよいですか?
VisualTreeHelper.HitTestをGeometryHitTestParameters引数と、VisualがPanelの直接の子であるかどうかをチェックする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
実際にヒットしたものだけでなく、ビジュアルツリー内のすべてのビジュアルを取得するために必要です。たとえば、パネルにラベルコントロールが含まれている場合、HitTestResultCallback
は各ラベルのBorderおよびTextBlockの子ビジュアルに対してのみ呼び出されます。
ヒットテストの可視性を制御するためのオプションはIsHitTestVisible
プロパティです。このプロパティを使用すると、UIElementがレンダリングされるブラシに関係なく、ヒットテストの可視性を制御できます。
また、塗りつぶしを透明に設定します
<Rectangle Width="200" Height="200" Margin="170,23,12,35" Fill="Transparent" IsHitTestVisible="True" />