首页 > 解决方案 > 拖动时如何将控件保留在其父控件中?

问题描述

所以我有一个名为UI_TileInformation的控件,它需要保存在其父容器(画布)内,同时允许用户自由拖动它。 该解决方案有助于使其正常运行,现在可以很好地拖动。但是,它可以被拖到其容器的边界之外。 这个解决方案没有帮助,因为我看不到 _transform 变量的来源。

该控件具有以下默认变量:

protected bool isDragging;
private Point clickPosition;

以及这些事件处理程序:

this.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(Control_MouseLeftButtonDown);
this.PreviewMouseLeftButtonUp += new MouseButtonEventHandler(Control_MouseLeftButtonUp);
this.PreviewMouseMove += new MouseEventHandler(Control_MouseMove);

我对 c# 和 WPF 相当陌生,但我发现这些事件处理程序只能在预览时使用(PreviewMouseMove 而不是 MouseMove)

至于让它拖动的代码,和上面第一个链接类似:

private void Control_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        isDragging = true;
        var draggableControl = sender as UI_TileInformation;
        clickPosition = e.GetPosition(this);
        draggableControl.CaptureMouse();
    }
private void Control_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        isDragging = false;
        var draggableControl = sender as UI_TileInformation;
        draggableControl.ReleaseMouseCapture();
    }
private void Control_MouseMove(object sender, MouseEventArgs e)
    {
        var draggableControl = sender as UI_TileInformation;

        if (isDragging && draggableControl != null)
        {
            Point positionInUIElement = e.GetPosition(this);

            var transform = draggableControl.RenderTransform as TranslateTransform;
            if (transform == null)
            {
                transform = new TranslateTransform();
                draggableControl.RenderTransform = transform;
            }
            transform.X = positionInCanvas.X - clickPosition.X;
            transform.Y = positionInCanvas.Y - clickPosition.Y;
        }
    }

我怎样才能让我的控制留在画布内?

标签: c#wpf

解决方案


推荐阅读