ドラッグドロップ

WPFのドラッグドロップ処理。まだよく分かっていないけどこんな感じ?

  • DataObjectを受け取る側はDragOverとDropを実装する。送る側はDragDrop.DoDragDropを呼び出す。
  • DataObjectを使わないドラッグ操作は自前で(Preview)MouseDown,(Preview)MouseMove,(Preview)MouseUPを処理する。Previewを使うよりHandledEventsTooを使う方がいい場合もある。
  • UIElement.InputHitTestはタブヘッダ中のTextBlockを返すなど、目的に合わない場合がある。VisualTreeHelper.HitTestとVisualTreeHelper.GetParentを使うと割と細かいヒットテストができる
  • しかしタブバーの余白などはVisualが存在しないため取れない。かわりに、背後に背景を透明に指定したBorderを敷くなどして工夫すると一応やりたいことは出来る。
  • ウィンドウの非クライアント領域のマウスイベントを取るには System.Windows.Interop のWindowInteropHelper.Handle , HwndSource.FromHwnd().AddHook() 等を使う。