2009-01-14 95 views
6

我的主窗口產生了一個位於頂部看起來像主體的一部分的子窗口。我想移動與主同步的子窗口,但我不知道如何。一次移動兩個WPF窗口?

我的主窗口中有哪些事件MouseLeftButtonDown調用這個函數我自己的標題欄:在主窗口中執行

public void DragWindow(object sender, MouseButtonEventArgs args) 
{ 
    DragMove(); 
    UpdateChildWindowPosition(); 
} 

這導致DragMove()單獨運行的主窗口,我拖動標題欄。 UpdateChildWindowPosition()不會被執行,直到我釋放鼠標以讀取某些元素座標並設置子窗口位置 - 您會看到子窗口對齊到不需要的位置。

如何讓子窗口與主窗口同步移動?

回答

5

AH HAH!

我的主窗口有一個與UpdateChildWindowPosition()綁定的事件LocationChanged。 LocationChange在(duh)位置發生變化時觸發,因此當我在上面提到的DragWindow中執行DragMove()時移動窗口時,它會不斷髮射。

3

您可以使用窗口的Left和Top屬性來放置輔助窗口。下面是代碼爲例粗略位:

在主窗口代碼:

 mDebugWindow.Left = this.Left + this.ActualWidth; 
     mDebugWindow.Top = this.Top; 

在這種情況下mDebugWindow是我的子窗口。這段代碼告訴它坐在主窗口的右側,窗口的頂部對齊。

希望這會有所幫助。

+1

謝謝,這是我UpdateChildWindowPosition相似的代碼()。它可以工作,但是當我拖動我的主窗口時,它不能實時工作。當我釋放拖拽時,它只會被執行,導致第二個窗口靜止不動,因爲我在釋放時拖動並卡入到位。 – Jippers 2009-01-15 01:54:29

0

您能否爲「子」形式公開DragMove()方法?那麼就從父母那裏調用它?

public void DragWindow(object sender, MouseButtonEventArgs args) 
{ 
    DragMove(); 
    UpdatePosition(); 

    childForm.DragMove(); 
    childForm.UpdatePosition(); 
} 

,或者如果你只是使用鼠標的位置來確定移動的形式,照此計算,在當前的DragMove()方法,改變你的孩子也形式的Form.Location財產?

+0

對不起,我不清楚。我已經更新了我的問題。 DragMove()是一個內置的WPF函數調用來移動我拖動的窗口。它保持執行狀態,直到我釋放拖動,在該拖動處調用UpdatePosition並將子窗口捕捉到某個位置。 – Jippers 2009-01-15 01:52:46

0

這裏是我做過什麼:

我第一次設置父爲子窗口的所有者的情況下,(在主窗口類public static MainWindow instance;設置它,然後instance = this;作出一個實例):

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

然後我在父類中添加事件處理程序時,家長正在火:

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

現在我遍歷所有在W在主窗口owened INDOWS重置其保證金:

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); 
    } 
}