我有一个自定义控件,我希望用户能够拖动它。所以我在自定义控件中输入以下代码:
void MoveableStackPanel_MouseMove(object sender, MouseEventArgs e)
{
if (IsMoving)
{
Point newLoc = e.GetPosition(null);
MainWindow.Instance.Title = newLoc.ToString(); // Debug
Margin = new Thickness(newLoc.X - 48, newLoc.Y - 48, 0, 0);
}
}
注意代码中的“-48”。 当鼠标向上或向左移动时,鼠标不再在控件区域中,因此不再触发MouseMove事件。所以我添加了-48两次来解决这个问题。但是当用户移动鼠标的速度快于框架可以更新时,鼠标将移出控件区域,控件也不再移动。
我正在考虑分配一个IMovableInterface并保留在主窗体中移动的控件列表等但是这样麻烦等等......什么是正确的解决方案?
P.S。:控件是动态生成的,因此我需要使用C#代码而不是XML格式的解决方案。
答案 0 :(得分:1)
尝试使用CaptureMouse Method。
看看这样的东西是否适合你。:
void moveableStackPanel1_MouseUp(object sender, MouseButtonEventArgs e)
{
ReleaseMouseCapture();
}
void moveableStackPanel1_MouseDown(object sender, MouseButtonEventArgs e)
{
if (IsEnabled && IsVisible)
CaptureMouse();
}
void moveableStackPanel1_MouseMove(object sender, MouseEventArgs e)
{
if (IsMouseCaptured)
{
Point newLoc = e.GetPosition(null);
Margin = new Thickness(newLoc.X, newLoc.Y, 0, 0);
}
}