2017-09-11 6 views
-1

UI上にドロップアクションをとるグリッド/パネルがあります。コントロールは、動的に作成されたコンテンツを含むグリッドです(重要な場合は、枠線のスタックパネルを含むビューボックス)。IsMouseOverとDragLeaveが正常に動作しません

関連する情報をグリッドにドラッグすると、内部コンテンツを変更(再生成)したいときにドロップしたり離したりすると、通常の状態に戻る必要があります。私は 'それを変更する'と 'それを戻す'メソッドは正常に動作しているが、私はそれらを呼び出すときに決定するのに問題があります。

グリッドにドラッグイベントをドラッグしてドラッグしました。入り口は素晴らしいですが、休暇はありません。グリッド内のコンテンツの上にマウスが移動すると、マウスがドラッグ離脱イベントを発生すると、コンテンツが変更されます(子供のコンテンツから戻すと、ドラッグすると再びドラッグして点滅します) 。

私の最初の考えは、マウスが実際にまだグリッド上にあるかどうかを判断して、コンテンツを戻さずにちょうど取り除くことでした。しかし、これは動作していないようです。ここでは、ドラッグ休暇のための私のコードは次のとおりです。

 private void Grid_DragLeave(object sender, DragEventArgs e) 
    { 
     var wizard = DataContext as WizardVM; 
     var gd = sender as Grid; 

     if (wizard == null || gd == null || gd.IsMouseOver || 
      gd.Children.Cast<FrameworkElement>().Any(x => x.IsMouseOver)) return; 

     wizard.Assembly.CollapsePreview(); 
    } 

あなたが見ることができるように、私も、グリッドの子を反復処理し、上にマウスがそれらと出て捨てるのいずれにも真であるかどうかを確認するために試みたが、まだそれだけで続けてそのすべてに対して偽を返し、崩壊する。私はIsMouseOverが、たとえそれがコントロールの子供であっても、マウスがまったく終わったかどうかを教えてくれると思っていたと思っていました...

+0

Winforms、WPF、ASP ..は何をターゲットにしていますか? __Always__質問に間違いをしないでください! – TaW

+0

IsMouseOverはtrueになりません。通常のマウス操作は、D + D操作の進行中に中断されます。どのように誰かがこのスニペットから代替案を提案できるか見えにくい。 –

+0

申し訳ありません、それはWPFです。だからハンスは、マウスがグリッドの境界にあるかどうかを知る方法がないと言っているのですか? – sfaust

答えて

0

もう少し研究をしても、私はVisualTreeHelper.HitTestを使用してコールバックを持つオーバーロードを使用しなければならなくなり、不明瞭であってもすべてのヒットアイテムを取得します。ここに私の最終的なコードは次のとおりです。

void Grid_DragLeave(object sender, DragEventArgs e) 
    { 
     var wizard = DataContext as WizardVM; 
     var gd = sender as Grid; 

     if (wizard == null || gd == null) return; 
     Point pt = e.GetPosition(this); 
     hitResults.Clear(); 
     VisualTreeHelper.HitTest(gd, null, GridHitTestResultCallback, 
      new PointHitTestParameters(pt)); 

     if (!hitResults.Contains(gd)) 
     { 
      wizard.Assembly.IsExpanded = false; 
     } 
    } 

    HitTestResultBehavior GridHitTestResultCallback(HitTestResult result) 
    { 
     hitResults.Add(result.VisualHit); 
     return HitTestResultBehavior.Continue; 
    } 

基本的に、それは完全なウィンドウに関連してポイントを取得し、そのポイントと私が一緒に仕事しようとしている全体的なグリッドにHitTest呼び出します。コールバックは、ヒットテストでヒットしたビジュアルのリストを生成します。最後に、元のメソッドは、グリッドがヒットのリストに含まれているかどうかをチェックし、グリッドがヒットのリストに含まれているかどうかをチェックします。

私も.ExpandPreview(から変更側の注意点としては

)と無関係の理由で.IsExpandedプロパティに.CollapsePreview()メソッド...誰がその変更によって混同したくなかった...

関連する問題