我需要用鼠标光标移动多个文本框。 我决定这样做。 如果单击文本框(并按下“控制”按钮),则会将文本框添加到所选项目列表中。然后当按下按钮时,当鼠标移动时,我会执行移动控件的操作。但是我的代码不能正常工作。文本框正在移动,但速度非常快。这是我的代码
List<TextBox> items;
private void txtBox_PreviewMouseDown(object sender, RoutedEventArgs e)
{
isClicked = true;
startPoint = Mouse.GetPosition( (sender as TextBox).Parent);
items = CurrentSelection;
}
private void txtBox_PreviewMouseMove(object sender, RoutedEventArgs e)
{
Point mousePos = Mouse.GetPosition(parentCanvas);
if (isClicked)
{
foreach (TextBox item in items)
{
double left = Canvas.GetLeft(item);
double top = Canvas.GetTop(item);
Canvas.SetLeft(item, left + (startPoint.X - mousePos.X));
Canvas.SetTop(item, top + (startPoint.Y - mousePos.Y));
}
}
}
基本上我遍历所有选定的项目并更改它们在画布上的位置。但是我可能以错误的方式计算新的位置。
答案 0 :(得分:1)
问题是,您总是计算到初始起点的增量。每次调用txtBox _ PreviewMouseMove
后,您必须实现startPoint。有点像......
private void txtBox_PreviewMouseMove(object sender, RoutedEventArgs e) {
Point mousePos = Mouse.GetPosition(parentCanvas);
if (isClicked){
foreach (TextBox item in items) {
double left = Canvas.GetLeft(item);
double top = Canvas.GetTop(item);
Canvas.SetLeft(item, left + (startPoint.X - mousePos.X));
Canvas.SetTop(item, top + (startPoint.Y - mousePos.Y));
}
startPoint=mousePoint;
}
}
......应该做的工作。我看到的另一件事是方向可能是倒置的。这很容易纠正。将计算结果更改为......
Canvas.SetLeft(item, left + (mousePos.X-startPoint.X ));
Canvas.SetTop(item, top + (mousePos.Y-startPoint.Y));
......这个问题也应该消失了。