2017-10-03 25 views
-2

現在、グリッドを含むフォームで作業しています。コントロールはグリッドに動的に追加されます。追加されるコントロールの唯一のタイプはボタンです。ユーザーは、コントロールを目的のセルに配置するために「ドラッグアンドドロップ」を使用する必要があります。また、特定のコントロールを配置したいセルがビジー状態の場合、コントロールは単に場所を切り替えるだけです。 私の優先順位は、appropriate cellのドラッグアンドドロップコントロールです。グリッド内に動的に追加されたコントロールを移動 - WPF

private void BtTable_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     mouseOffset = Mouse.GetPosition(this); 
     CaptureMouse(); 
     //GridContent.Parent = this; 
    } 
を私は次のことを試してみましたが、それはのMouseLeftButtonDown

変数

Point mouseOffset; 
Point position; 

を動作しません。

のMouseMove

private void BtTable_MouseMove(object sender, MouseEventArgs e) 
     { 
      if (IsMouseCaptured) 
      { 
       Point mouseDelta = Mouse.GetPosition(this); 
       mouseDelta.Offset(-mouseOffset.X, -mouseOffset.Y); 
       Margin = new Thickness(
        Margin.Left + mouseDelta.X, 
        Margin.Top + mouseDelta.Y, 
        Margin.Right - mouseDelta.X, 
        Margin.Bottom - mouseDelta.Y); 
      } 
     } 

のMouseLeftButtonUp

private void BtTable_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     Grid.SetRow(this, (int)position.Y); 
     Grid.SetColumn(this, (int)position.X); 
     Margin = new Thickness(); 
    } 

GetPosition方法

public void getPosition(UIElement element, out int col, out int row) 
    { 
     Button newBtn = element as Button; 
     Grid grid = newBtn.Parent as Grid; 
     var point = Mouse.GetPosition(element); 
     row = 0; 
     col = 0; 
     double accumulatedHeight = 0.0; 
     double accumulatedWidth = 0.0; 

     // calc row mouse was over 
     foreach (var rowDefinition in grid.RowDefinitions) 
     { 
      accumulatedHeight += rowDefinition.ActualHeight; 
      if (accumulatedHeight >= point.Y) 
       break; 
      row++; 
     } 

     // calc col mouse was over 
     foreach (var columnDefinition in grid.ColumnDefinitions) 
     { 
      accumulatedWidth += columnDefinition.ActualWidth; 
      if (accumulatedWidth >= point.X) 
       break; 
      col++; 
     } 
    } 

ここで何が間違っているのか、そしてドラッグアンドドロップが動作しない理由はありますか? ありがとうございます。

答えて

-1

解決策が推奨されています。 MouseLeftButtonDown + MouseMoveを使用してドラッグアンドドロップを検出するのは正しいことです。ずっと簡単にはできないと思う。

使いやすくしたい場合は、別のパッケージに入れてください。 Gong WPF Drag&Dropのような既存のパッケージを使用してください。

+0

私のソリューションは終わりに近づいていますが、それでも問題は解決しないため、どこに問題があるのか​​分かりません。 –

+0

あなたの質問にその情報を追加する必要があります。あなたはあなたの解決策がうまくいかなかったことは何も述べていない。代わりに、「よりシンプルで洗練された方法でこれを行う方法はありますか? – Picard

関連する問題