拖放元素(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获得新位置,但这是子画布在主窗口中的位置,而不是相对于父画布的位置。一定有办法得到它…

拖放元素(MouseDragElementBehavior)的位置

我刚刚找到了一个解决方案:

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或其他东西中,将会出现问题。这种拖放方法似乎没有一个简单的解决方案…