【发布时间】:2015-08-22 21:54:40
【问题描述】:
我有一个父控件,里面有一个孩子。 现在我希望能够通过
在父母内部移动那个孩子- 点击它来拉动它
- 单击父项上的某处以开始从单击位置拉动它
- 单击父项或子项上的某处将子项设置到光标位置
我为父子事件定义了一个 MouseDown 事件,该事件最初移动子对象,然后将 MouseMove 处理程序附加到子对象和父对象。子级和父级还有一个 MouseUp 处理程序,用于删除 MouseMove 处理程序。我希望即使 MouseUp 出现在窗口之外或窗口被 alt+tab 键移开,也能调用 MouseUp。
这是我的代码,它基本上可以工作,但不可靠。我经常遇到附加了 MM (MouseMove) 的情况,但不能再调用 MouseUp 或 MouseDown,基本上使我的应用程序死锁。最终进入该状态的一种方法是
- 按下父/子
- alt+tab 切换到另一个窗口
- 鼠标悬停在另一个窗口上时松开鼠标
如何正确实现将子元素移入其父元素的行为?
我的孩子叫滑块。 这段代码在我父母后面的代码中,这是我正在处理的自定义控件。
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