1

Windowsエクスプローラーのようなクリックアンドドラッグ選択を実装しようとしています(マウスボタンを押したままマウスを動かすと発生する青い選択長方形)。

したがって、基本的には、スタイル設定およびテンプレート化された ListViewItem を使用した ListView があります。ListViewItem (EventSetter を使用) に MouseEnter および MouseLeave イベントを追加しました。マウスの左ボタンが押されている場合を除いて、正常に動作します。この場合、イベントは発生しません。これは、私が達成しようとしているものには適していません。

これに対する良い回避策があるかどうか知っていますか? マウスの左ボタンが押されたとき、または項目の上にいるときを知りたいです。

今のところ、VisualTreeHelper.HitTest() を試してみましたが、ListViewItem を横切ったときしかわかりません。いつそれを離れるかを知る必要があります。

ありがとうございました。

4

3 に答える 3

1

UIElement.CaptureMouseボタンが押されたときにマウスをキャプチャしてからUIElement.ReleaseMouseCapture、MouseUpイベント中にマウスを離す必要があります。キャプチャ中にすべてのマウス入力がUIElementに送られるため、他のイベントについて心配する必要はありません。

この形式の選択は「投げ縄選択」と呼ばれ、Windowsアプリのほとんどのウィジェットがそれをサポートしています。実際、ListView自体はすでにそうしています。

于 2011-01-28T21:54:09.257 に答える
0

MouseEnter イベントと Leave イベントが発生したとしても、どちらのイベントも最終的には無関係であるため、適切な選択方法を提供しません。マウスがそのフォルダーまたはファイルに触れたかどうかは関係ありません。重要なのは、それがボタンを離した時点で四角形になります。これは、Mouse Up & Down で十分であることを意味します。リストによっては、それらのイベントが発生した 2 つのアイテムを見るだけで、どのアイテムを選択する必要があるかを推測できる場合もあります (たとえば、2 次元のグリッドではなく 1 次元のリストである場合)。

グリッドがある場合は、どの領域がカバーされているかを追跡したり、どのアイテムが内側または端にあるかを確認したりするなど、より複雑なメカニズムが必要になります。

于 2011-01-28T16:02:34.053 に答える
0

したがって、この動作を処理する別の解決策を見つけました。

このstackoverflowの回答で始めましたWPFの選択ボックスをクリックしてドラッグします

mouseMove では、selectionBox のサイズを変更した後、selectionBox 領域にあるアイテムを選択します。

私はこのようにします:

 //Select all visible items in select region.
 Rect selectRect = new Rect(Canvas.GetLeft(selectionBox), Canvas.GetTop(selectionBox),
                (Canvas.GetLeft(selectionBox) + selectionBox.Width), (Canvas.GetTop(selectionBox) + selectionBox.Height));

 RectangleGeometry rr = new RectangleGeometry(selectRect);
 foreach (CustomElement elt in mainList.Items)
 {
  ListViewItem item = mainList.ItemContainerGenerator.ContainerFromItem(elt) as ListViewItem;
  Rect r = LayoutInformation.GetLayoutSlot(item);
  if (r.IntersectsWith(selectRect))
        item.IsSelected = true;
  else
        item.IsSelected = false;
 }

LayoutInformation がオブジェクトを表す Rect を提供できることがわかったので、selectionBox Rect と交差するかどうかを確認できます。

于 2011-01-29T16:52:26.590 に答える