3

任意の数のギザギザのサイズの要素を含むWrapPanelがあります。アイテムにドラッグセレクトを実装したいのですが。

ポイントをHitTestする方法はかなり明白に思えますが、長方形の領域内のすべてのアイテムを見つけるにはどうすればよいですか?

4

2 に答える 2

6

VisualTreeHelper.HitTestGeometryHitTestParameters引数と、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の子ビジュアルに対してのみ呼び出されます。

于 2013-02-12T12:24:40.660 に答える
-1

ヒットテストの可視性を制御するためのオプションはIsHitTestVisibleプロパティです。このプロパティを使用すると、UIElementがレンダリングされるブラシに関係なく、ヒットテストの可視性を制御できます。

また、塗りつぶしを透明に設定します

 <Rectangle  Width="200" Height="200" Margin="170,23,12,35" Fill="Transparent" IsHitTestVisible="True"   />
于 2013-02-12T12:17:32.323 に答える