gpt4 book ai didi

c# - 在 WPF 中的网格中的单元格之间拖放自定义控件

转载 作者:太空狗 更新时间:2023-10-30 01:04:00 27 4
gpt4 key购买 nike

我有一些动态添加到自定义网格的自定义控件。这些控件可以跨越多个列和行(它们的大小都相同)。我想在行和列之间拖放。我可以拖动各个控件,但它们可以无限制地移动到任何地方。甚至脱离电网。我想这样做,所以它只能被拖到网格内并捕捉到它被拖到的列/行。

有什么简单的方法可以做到这一点吗?

老实说,如果我可以获得当前行/列,那么我需要做的就是将它的列/行设置为它们,这可能会做到,然后只需担心将其保留在里面网格。

最佳答案

我想出了一个不错又有趣的方法!

我计算出鼠标在 MouseUp 事件中在网格上的位置,然后计算出鼠标在控件上的相对位置,因为它跨越多个行/列。

public void getPosition(UIElement element, out int col, out int row)
{
DControl control = parent as DControl;
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 control.RowDefinitions)
{
accumulatedHeight += rowDefinition.ActualHeight;
if (accumulatedHeight >= point.Y)
break;
row++;
}

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

然后我将相对位置从正常位置移开,这样当你放下它时,它总是落在屏幕的左上角。当我移动我的控件时,我使用边距来移动它,这会弄乱当时在网格上的位置,如下所示:

void Chart_PreviewMouseMove(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);
}

}

void Chart_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
mouseOffset = Mouse.GetPosition(this);
CaptureMouse();
parent.currentObject = this;
}

为了解决这个问题,我只是重置了边距。

public void updatePosition()
{
Grid.SetRow(this, (int)position.Y);
Grid.SetColumn(this, (int)position.X);
Margin = new Thickness();
}

我希望这对其他人有所帮助,因为找到答案对我来说相当令人沮丧,最后我设法获得了很多关于如何做事的小片段,并最终提出了我自己的解决方案。

关于c# - 在 WPF 中的网格中的单元格之间拖放自定义控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25282443/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com