2013-10-17 64 views
1

我有兩種類型的窗口:主要子項。當我移動主體時,所有的子窗口也必須移動。我所有的窗戶都有風格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

回答

1

我會根據您的代碼片段一個假設,即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

0

這裏是我做過什麼:

我第一次通過設置它設置父爲子窗口的所有者的一個實例,(使一個實例所述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); 
    } 
}