【问题标题】:Moving a child around inside of it's parent在它的父母内部移动一个孩子
【发布时间】:2015-08-22 21:54:40
【问题描述】:

我有一个父控件,里面有一个孩子。 现在我希望能够通过

在父母内部移动那个孩子
  1. 点击它来拉动它
  2. 单击父项上的某处以开始从单击位置拉动它
  3. 单击父项或子项上的某处将子项设置到光标位置

我为父子事件定义了一个 MouseDown 事件,该事件最初移动子对象,然后将 MouseMove 处理程序附加到子对象和父对象。子级和父级还有一个 MouseUp 处理程序,用于删除 MouseMove 处理程序。我希望即使 MouseUp 出现在窗口之外或窗口被 alt+tab 键移开,也能调用 MouseUp。

这是我的代码,它基本上可以工作,但不可靠。我经常遇到附加了 MM (MouseMove) 的情况,但不能再调用 MouseUp 或 MouseDown,基本上使我的应用程序死锁。最终进入该状态的一种方法是

  1. 按下父/子
  2. alt+tab 切换到另一个窗口
  3. 鼠标悬停在另一个窗口上时松开鼠标

如何正确实现将子元素移入其父元素的行为?

我的孩子叫滑块。 这段代码在我父母后面的代码中,这是我正在处理的自定义控件。

    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;
    }

图片相关,我在做什么:

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    将要拖动的元素包装在 &lt;Thumb&gt; 中,该元素具有 DragDelta 事件,事件数据中包含 Horizo​​ntalChange 和 VerticalChange。看看here

    【讨论】:

    • Thumb 可以轻松地处理所有事件处理,但有什么方法可以阻止它在一次多次停止的拖动操作中累积 HChange 和 VChange 值?就像我将它向下移动 3 个单位并且有三个事件第一个具有 VChange 1、第二个 2 和第三个 3 当我希望它们三个都为 1 时(所有事件 Vchange 值相加导致移动单位的价值)。现在我总是保存最后的 hc 和 vc 值,并在实际使用时减去它们。我在 DragStarted 上将它们设置为零。
    • 这很奇怪,正如您在链接中的示例中看到的那样,事件数据通常仅包含自上次 delta 以来的 delta - 正是您需要的。对我来说似乎也是如此。也许编辑您的问题或使用您的所有代码为此打开一个新问题。
    猜你喜欢
    • 2018-01-15
    • 2013-09-03
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多