Wpf 移动多个控件
我需要用鼠标光标移动多个文本框。 我决定这样做。 如果单击文本框(并按下控制按钮),文本框将添加到所选项目的列表中。然后,当按钮仍然按下,当鼠标移动时,我做一个移动控件的操作。然而,我的代码工作不好。文本框正在移动,但速度非常快。这是我的密码Wpf 移动多个控件,wpf,controls,Wpf,Controls,我需要用鼠标光标移动多个文本框。 我决定这样做。 如果单击文本框(并按下控制按钮),文本框将添加到所选项目的列表中。然后,当按钮仍然按下,当鼠标移动时,我做一个移动控件的操作。然而,我的代码工作不好。文本框正在移动,但速度非常快。这是我的密码 List<TextBox> items; private void txtBox_PreviewMouseDown(object sender, RoutedEventArgs e) { isClicke
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));
}
}
}
列表项;
私有void txtBox_PreviewMouseDown(对象发送器、路由目标)
{
isClicked=true;
startPoint=Mouse.GetPosition((发送者作为文本框).Parent);
项目=当前选择;
}
私有void txtBox\u预览移动鼠标(对象发送器,路由目标e)
{
Point mousePos=Mouse.GetPosition(parentCanvas);
如果(已单击)
{
foreach(项目中的文本框项目)
{
左双=Canvas.GetLeft(项目);
double-top=Canvas.GetTop(项目);
SetLeft(item,left+(startPoint.X-mousePos.X));
SetTop(item,top+(startPoint.Y-mousePos.Y));
}
}
}
基本上,我遍历所有选定的项目并更改它们在画布上的位置。但是,我可能用错误的方法计算新位置。问题是,您总是计算初始起点的增量。每次调用txtBox\ucode>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));
。。。这个问题也应该解决。问题是,您总是计算初始起点的增量。每次调用txtBox\ucode>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));
。。。这个问题也应该解决