拖放元素(MouseDragElementBehavior)的位置
本文关键字:位置 MouseDragElementBehavior 元素 拖放 | 更新日期: 2023-09-27 18:07:33
我正在尝试使用MouseDragElementBehavior实现带有拖放功能的WPF应用程序。但我就是找不到一种方法来获得相对于其父Canavs的被删除元素位置。示例代码:
namespace DragTest {
public partial class MainWindow : Window {
private Canvas _child;
public MainWindow() {
InitializeComponent();
Canvas parent = new Canvas();
parent.Width = 400;
parent.Height = 300;
parent.Background = new SolidColorBrush(Colors.LightGray);
_child = new Canvas();
_child.Width = 50;
_child.Height = 50;
_child.Background = new SolidColorBrush(Colors.Black);
MouseDragElementBehavior dragBehavior = new MouseDragElementBehavior();
dragBehavior.Attach(_child);
dragBehavior.DragBegun += onDragBegun;
dragBehavior.DragFinished += onDragFinished;
Canvas.SetLeft(_child, 0);
Canvas.SetTop(_child, 0);
parent.Children.Add(_child);
Content = parent;
}
private void onDragBegun(object sender, MouseEventArgs args) {
Debug.WriteLine(Canvas.GetLeft(_child));
}
private void onDragFinished(object sender, MouseEventArgs args) {
Debug.WriteLine(Canvas.GetLeft(_child));
}
}
}
drop child Canvas后,Canvas.GetLeft(_child)
的值仍然是0。为什么呢?为什么它没有改变?
当然,我可以通过使用dragBehavior.X
获得新位置,但这是子画布在主窗口中的位置,而不是相对于父画布的位置。一定有办法得到它…
我刚刚找到了一个解决方案:
private void onDragFinished(对象发送方,MouseEventArgs args) {Point windowCoordinates = new Point(((MouseDragElementBehavior)sender)。X ((MouseDragElementBehavior)发送者).Y);点屏幕坐标= this.PointToScreen(windowCoordinates);Point parentCoordinates = _parent.PointFromScreen(screenCoordinates);Debug.WriteLine (parentCoordinates);} 之前所以我简单地将点转换为屏幕坐标,然后从屏幕坐标转换为父坐标。
然而,如果父画布在一些ScrollView或其他东西中,将会出现问题。这种拖放方法似乎没有一个简单的解决方案…