在 parent 内部移动 child
Moving a child around inside of it's parent
我有一个 parent 控件,里面有一个 child。
现在我希望能够通过
在 parent 内部移动 child
- 点击它来拉动它
- 单击 parent 上的某处开始从单击位置拖动它
- 单击 parent 或 child 的某处以将 child 设置为光标位置
我为 parent 和 child 定义了一个 MouseDown 事件,该事件最初移动 child,然后将 MouseMove 处理程序附加到 child 和 parent. child 和 parent 也有一个移除 MouseMove 处理程序的 MouseUp 处理程序。我希望即使 MouseUp 发生在 window 之外或者 window 被 alt+tab 键关闭,我也希望调用 MouseUp。
这是我的代码,它基本上可以工作,但不可靠。我经常遇到连接了 MM (MouseMove),但无法再调用 MouseUp 或 MouseDown 的情况,这基本上使我的应用程序陷入僵局。结束该状态的一种方法是
- 按下 parent/child
- alt+tab 到另一个 window
- 将鼠标悬停在另一个上时释放鼠标 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>
中,该元素具有事件数据中包含 HorizontalChange 和 VerticalChange 的 DragDelta 事件。看看here
我有一个 parent 控件,里面有一个 child。 现在我希望能够通过
在 parent 内部移动 child- 点击它来拉动它
- 单击 parent 上的某处开始从单击位置拖动它
- 单击 parent 或 child 的某处以将 child 设置为光标位置
我为 parent 和 child 定义了一个 MouseDown 事件,该事件最初移动 child,然后将 MouseMove 处理程序附加到 child 和 parent. child 和 parent 也有一个移除 MouseMove 处理程序的 MouseUp 处理程序。我希望即使 MouseUp 发生在 window 之外或者 window 被 alt+tab 键关闭,我也希望调用 MouseUp。
这是我的代码,它基本上可以工作,但不可靠。我经常遇到连接了 MM (MouseMove),但无法再调用 MouseUp 或 MouseDown 的情况,这基本上使我的应用程序陷入僵局。结束该状态的一种方法是
- 按下 parent/child
- alt+tab 到另一个 window
- 将鼠标悬停在另一个上时释放鼠标 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>
中,该元素具有事件数据中包含 HorizontalChange 和 VerticalChange 的 DragDelta 事件。看看here