我有一个带有孩子的父控件。 现在我希望能够通过
将那个孩子移到父母身边我为最初移动子项的父级和子级定义了一个MouseDown事件,然后将MouseMove Handler附加到子级和父级。子级和父级还有一个MouseUp Handler,用于删除MouseMove处理程序。我希望调用MouseUp,即使MouseUp发生在窗口外面,或者窗口是alt + tabbed。
这是我的代码,它基本上有效,但不可靠。我常常会在MM(MouseMove)连接的情况下结束,但是不能再调用MouseUp或MouseDown,这实际上会使我的应用程序死锁。最终处于该状态的一种方法是
如何正确实现将孩子移入其父母的这种行为?
我的孩子被称为滑块。 这段代码在我父母的代码后面,这是我正在处理的自定义控件。
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;
}
答案 0 :(得分:2)
将要拖动的元素包裹在<Thumb>
中,该事件数据中包含具有HorizontalChange和VerticalChange的DragDelta事件。看看here