在 parent 内部移动 child

Moving a child around inside of it's parent

我有一个 parent 控件,里面有一个 child。 现在我希望能够通过

在 parent 内部移动 child
  1. 点击它来拉动它
  2. 单击 parent 上的某处开始从单击位置拖动它
  3. 单击 parent 或 child 的某处以将 child 设置为光标位置

我为 parent 和 child 定义了一个 MouseDown 事件,该事件最初移动 child,然后将 MouseMove 处理程序附加到 child 和 parent. child 和 parent 也有一个移除 MouseMove 处理程序的 MouseUp 处理程序。我希望即使 MouseUp 发生在 window 之外或者 window 被 alt+tab 键关闭,我也希望调用 MouseUp。

这是我的代码,它基本上可以工作,但不可靠。我经常遇到连接了 MM (MouseMove),但无法再调用 MouseUp 或 MouseDown 的情况,这基本上使我的应用程序陷入僵局。结束该状态的一种方法是

  1. 按下 parent/child
  2. alt+tab 到另一个 window
  3. 将鼠标悬停在另一个上时释放鼠标 window

如何正确实现将 child 移动到 parent 内部的这种行为?

我的child叫滑块。 此代码在我的 parent 的代码后面,这是我正在处理的自定义控件。

    slider.MouseLeftButtonDown += MD;
    MouseLeftButtonDown += MD;

    slider.MouseUp += MU;
    PreviewMouseUp += MU;

    private void MM(object sender, MouseEventArgs meva)
    {
        double percentage = meva.GetPosition(this).Y / this.ActualHeight;
        if (percentage <= 0)
        {
            Percentage = 0;
            slider.Margin = new Thickness(0, -2, 0, 0);
        }
        else if (percentage >= 1)
        {
            Percentage = 1;
            slider.Margin = new Thickness(0, this.ActualHeight - 2, 0, 0);
        }
        else
        {
            Percentage = percentage;
            slider.Margin = new Thickness(0, meva.GetPosition(this).Y - 2, 0, 0);
        }
    }
    // MouseDown Handler
    private void MD(object sender, MouseButtonEventArgs e)
    {
        ReleaseMouseCapture(); // might be unnecessary?
        MM(sender, e); // initial movement of child
        this.CaptureMouse(); // To enable MouseUp outside
        this.PreviewMouseMove += MM;
        slider.PreviewMouseMove += MM;
    }
    // MouseUp Handler
    private void MU(object sender, MouseButtonEventArgs e)
    {
        ReleaseMouseCapture();
        this.PreviewMouseMove -= MM;
        slider.PreviewMouseMove -= MM;
    }

图片相关,我在做什么:

将要拖动的元素包裹在 <Thumb> 中,该元素具有事件数据中包含 Horizo​​ntalChange 和 VerticalChange 的 DragDelta 事件。看看here