在孩子的父母身边移动一个孩子

时间:2015-08-22 21:54:41

标签: wpf wpf-controls

我有一个带有孩子的父控件。 现在我希望能够通过

将那个孩子移到父母身边
  1. 点击它以拉动它
  2. 点击父级的某个位置,开始从点击位置拉出来
  3. 单击父或子项上的某个位置以将子项设置为游标位置
  4. 我为最初移动子项的父级和子级定义了一个MouseDown事件,然后将MouseMove Handler附加到子级和父级。子级和父级还有一个MouseUp Handler,用于删除MouseMove处理程序。我希望调用MouseUp,即使MouseUp发生在窗口外面,或者窗口是alt + tabbed。

    这是我的代码,它基本上有效,但不可靠。我常常会在MM(MouseMove)连接的情况下结束,但是不能再调用MouseUp或MouseDown,这实际上会使我的应用程序死锁。最终处于该状态的一种方法是

    1. 按下父母/孩子
    2. alt + tabbing到另一个窗口
    3. 在鼠标悬停在另一个窗口时释放鼠标
    4. 如何正确实现将孩子移入其父母的这种行为?

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

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

      图片相关,我正在做的事情: enter image description here

1 个答案:

答案 0 :(得分:2)

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