2011-11-09 8 views
2

私はアプリケーションからタブ項目をドラッグできるタブコントロールがあります。
このドラッグにより、マウスの左ボタンを離すまで、マウスの次のウィンドウが開きます。
また、タブ項目を元のタブコントロールにドラッグして元の親またはドラッグしたデータを理解できる他のコントロールに再接続することもできます。ドラッグアンドドロップ操作中にhitTestトラフをコントロールに渡す方法

private static void DragOutTabControl_PreviewQueryContinueDrag(object sender, QueryContinueDragEventArgs e) 
{ 
    e.Handled = true; 

    if (DragControlIsHit) 
    { 
     if (_previewWindow != null && _previewWindow.IsVisible) 
     { 
     _previewWindow.Clear(); 
     _previewWindow.Hide(); 
     } 
    } 
    else 
    { 
     if (_previewWindow == null) 
     { 
     _previewWindow = new PreviewWindow(); 
     _previewWindow.SetData(); 
     } 

     _previewWindow.Left = CursorPos.X - 15; 
     _previewWindow.Top = CursorPos.Y - 15; 
     _previewWindow.Show(); 
    } 
} 

私が今問題にしているのは、プレビューウィンドウがマウスの後にくると、カーソルのすぐ下に位置するということです。
この方法では、ウィンドウがヒットテストをブロックしているため、ソースタブコントロールのdragEnterおよびdragOverイベントが発生しません。
ウィンドウ内でIsHitTestVisibleをfalseに設定したとしても、ドラッグの&ドロップがまだアクティブな間にヒットテストがブロックされます。
IsEnabledをfalseに設定し、背景をnullに変更しても効果はありません。

public PreviewWindow() 
{ 
    Background = null; 
    IsEnabled = false; 
    IsHitTestVisible = false; 
} 

任意のヒットテストからプレビューウィンドウを非表示にするか、視覚的にドラッグウィンドウの背後にある任意のコントロールに手動でヒットテストに合格するために、任意の可能性はありますか?

編集:私の問題の詳細:
タブコントロールをタブコントロールからドラッグして新しいウィンドウを開くだけでなく、追加のタブアイテムをドラッグして既存のドラッグアウトウィンドウ。
さらに、タブ項目を元のタブコントロールにドラッグしてドラッグすることも可能です。

このすべては、プレビューウィンドウをドラッグしてドロップすることができないという唯一の問題を除いて、非常にうまく動作します&ドロップヒットテスト。

答えて

1

私はDragDropイベントヒットテストについて同様の質問を受けました。the answerは、DragDropイベントの代わりにMouseEventsを使用するように切り替えられました。私はそのスイッチを作ったことがありませんし、決してそれを後悔したり、WPFの組み込みのDragDropイベントに戻ってみることもありませんでした。

マウスイベントを使用したくない場合は、UIレイヤではなくAdornerレイヤにウィンドウを表示し、Dropイベントが発生した場合にのみ新しいオブジェクトとしてレンダリングします。

+0

まずはお返事ありがとうございます。 それは私の考えをサポートしていますが、ドラッグ&ドロップを他のソースから処理できなければならないので、DragDropEventsの代わりに通常のMouseEventsを使いたくありません。 – lukas

+0

また、私はadornerに試してみましたが、私はマウスボタンを離すとウィンドウが作成されなければならないのが好きではありません。 – lukas

2

レイチェルの答えは絶対に正しいと私は通常のMouseEventsの代わりDragDropEventsを使用することを誰にもお勧めします。
しかし、私は、私は別の解決策を考え出す必要があったドラッグに関連する私のアプリケーションで複数のウィンドウがあるので:DragOver DragOverは(hitControl、_draggedItem)は、通常のDragEnterまたは呼び出される関数である

private static void ProcessDraggedHitTest(
     Window window) 
    { 
     var CursorPos = GetCursorPos(); 
     var MousePosition = Mouse.GetPosition(window); 

     IDragTarget hitControl = null; 
     var hitTestResult = VisualTreeHelper.HitTest(window, new Point(CursorPos.X + MousePosition.X, CursorPos.Y + MousePosition.Y)); 
     if (hitTestResult != null) 
     { 
      var parent = hitTestResult.VisualHit as DependencyObject; 
      while (parent != null) 
      { 
       hitControl = parent as IDragTarget; 
       if (tileOutControl != null) 
        break; 
       else 
        parent = VisualTreeHelper.GetParent(parent); 
      } 

      if (hitControl != null) 
       DragOver(hitControl, _draggedItem); 
     } 
    } 

をDragOverイベントが発生し、GetCursorPos()は正しいマウス位置を取得するためのWin32呼び出しです。

これで、すべてのウィンドウに対して正しいzオーダーの関数を呼び出す必要があります。

私は私が私の解決策に役立つことを願ったが、誰もがこれを行うには良い方法をスポット場合、私はそれを聞いて非常に興味があります。

関連する問題