現在、グリッドを含むフォームで作業しています。コントロールはグリッドに動的に追加されます。追加されるコントロールの唯一のタイプはボタンです。ユーザーは、コントロールを目的のセルに配置するために「ドラッグアンドドロップ」を使用する必要があります。また、特定のコントロールを配置したいセルがビジー状態の場合、コントロールは単に場所を切り替えるだけです。 私の優先順位は、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++;
}
}
ここで何が間違っているのか、そしてドラッグアンドドロップが動作しない理由はありますか? ありがとうございます。
私のソリューションは終わりに近づいていますが、それでも問題は解決しないため、どこに問題があるのか分かりません。 –
あなたの質問にその情報を追加する必要があります。あなたはあなたの解決策がうまくいかなかったことは何も述べていない。代わりに、「よりシンプルで洗練された方法でこれを行う方法はありますか? – Picard