WPF将两个窗口一起移动

问题描述:

我有两种类型的窗口:主要子项。当我移动主体时,所有的子窗口也必须移动。我所有的窗户都有风格None,所以我使用DragMove。对于移动的孩子,我使用LocationChange。如果我开始快速移动主窗口,孩子会有一些延迟。我的窗户彼此粘在一起,所以当快速移动主窗口时,会出现一些间隙。 我使用这个问题 Move two WPF windows at once?WPF将两个窗口一起移动

我该如何缩小这个差距?

一些代码:

​​

在这里,我将所有的孩子

public static void ParentWndMove(Window parentWindow) 
    { 
     for (int i = 0; i < windowsToMove.Length; i++) 
     { 
      if (windowsToMove[i]) 
      { 
       windows[i].Top += -(parentWindowPosition.Y - parentWindow.Top); 
       windows[i].Left += -(parentWindowPosition.X - parentWindow.Left); 
      } 
     } 

     parentWindowPosition.X = parentWindow.Left; 
     parentWindowPosition.Y = parentWindow.Top; 
    } 
+0

你能共享代码? – nuke

+0

添加到帖子中。 – Tino

我会根据您的代码片段一个假设,即parentWindowPosition 是一个结构或类将X和Y初始化为MainWindow的Left和Top值。

如果是这样的话,那么只需要在你的MouseLeftButtonDown处理程序做的一件事就是打电话DragMove()

private void MainWindow_OnMouseLeftButtonDown(object sender, 
               MouseButtonEventArgs e) 
{ 
    DragMove(); 
} 

你的主窗口的LocationChanged事件注册的处理程序。

LocationChanged += MainWindow_OnLocationChanged; 

这就要求你ParentWndMove()方法

private void MainWindow_OnLocationChanged(object sender, EventArgs e) 
{ 
    ParentWndMove(sender as Window) 
} 

此代码的工作我没有延迟的系统无论我怎样快速拖动主窗口和窗口位置永远走不出同步。

注意:您发布的ParentWndMove()方法有一些编译时错误。我张贴了固定的版本以供参考

public static void ParentWndMove(Window parentWindow) 
{ 
    for (int i = 0; i < windowsToMove.Length; i++) 
    { 
     if (windowsToMove[i] != null) 
     { 
      windowsToMove[i].Top += -(parentWindowPosition.Y - parentWindow.Top); 
      windowsToMove[i].Left += -(parentWindowPosition.X - parentWindow.Left); 
     } 
    } 

    parentWindowPosition.X = parentWindow.Left; 
    parentWindowPosition.Y = parentWindow.Top; 
} 
+0

在此处添加示例项目: [sourse](https://mega.co.nz/#!ExcRVTJS!Rv3_dhqiLQry3KSRaQjIX1H_AY4PKdIxmiuyPEhPHO0) 如果我移动得很快,我可以在两个窗口之间看到手机图片。 – Tino

这里是我做过什么:

我第一次通过设置它设置父为子窗口的所有者的一个实例,(使一个实例所述ParentWindow类public static ParentWindow instance;然后instance = this;):

public ChildWindow() 
{ 
    Owner = ParentWindow.instance; 
    InitializeComponent(); 
} 

然后我在父类中添加事件处理程序,当父移动火:

public ParentWindow() 
{ 
    InitializeComponent(); 
    LocationChanged += new EventHandler(Window_LocationChanged); 
} 

现在,我通过了ParentWindow owened重置其保证金的所有窗口循环:

private void Window_LocationChanged(object sender, EventArgs e) 
{ 
    foreach (Window win in this.OwnedWindows) 
    { 
     win.Top = this.Top + ((this.ActualHeight - win.ActualHeight)/2); 
     win.Left = this.Left + ((this.ActualWidth - win.ActualWidth)/2); 
    } 
}