ListBox上のListBoxItem、またはListBox上のListBox.Backgroundが見えている領域に対してDrag&Dropを行い、要素の並べ替え/挿入を行おうとしています。

この時、ListBoxの背景要素にDropした際、Dropした位置によって適切な挿入先のIndexを計算する方法が分からず、詰まってしまっています。

- 出来たこと
ListBox上のListBoxItemに対するDropは、DragEventArgs.OriginalSourceを使って現在Dropしようとしている先のFrameworkElementを特定→ListBox.ItemsSourceからDataContextの内容で探す……などの方法でDrop先Indexを計算する事ができました。

- 出来なくて困っていること(知りたいこと)
ListBox上のDrop位置において、以下の図のような領域⇔Index値となる計算をしたいのですが、以下の3点を計算・区別する方法が分かりませんでした。

  1. ListBoxItem間のMarginの位置へのDrop時のIndex計算
  2. WrapPanelでの折り返し位置(図上のIndex 4の位置)へのDrop時のIndex計算
  3. 1,2に含まれない末尾全般領域(図上のIndex 6の位置)へのDrop時のIndex計算

WrapPanel上のDrop位置と期待するIndex値

実現方法が分かる方、よろしくお願いします。