2012-03-15 69 views
0

我有一個無模式的對話框,它由主窗口擁有,並且捕捉到主窗口中的某個參考點。我通過計算屏幕座標中參考點的左上角並將其分配給擁有窗口的Top和Left屬性來完成此操作。如何將擁有的窗口與WPF中的所有者一起移動?

當我打開擁有的無模式對話框時,一切正常。然後,當我通過鼠標移動主窗口時,我想讓擁有的對話框同時移動。爲此,我重新計算參考點的屏幕位置,並將其傳遞給MouseMove事件處理程序中擁有的窗口的Top和Left屬性。顯然,這樣的東西應該可以工作(參見線程: Lock a window position to another window? )。然而,在我的情況下,擁有的窗口不隨着所有者移動,而只有當我放下主窗口並將其懸停在其客戶區時,擁有的窗口才跳轉到其預期的位置。

在MFC中,我可以通過將WM_WINDOWPOSCHANGED事件發送到擁有的窗口來解決問題。但是,我可以在WPF中做什麼?

+0

試試看看我的問題/答案http://stackoverflow.com/q/8174670/920384 – punker76 2012-03-15 15:09:40

回答

2

下面的代碼對我來說工作得很好。還有一個更復雜的綁定解決方案。

在主窗口獲取事件的LocationChanged:

<Window ... LocationChanged="Window_LocationChanged"> 

在代碼隱藏,保持對話作爲主窗口的一個領域。然後有下面的代碼:

public partial class MainWindow : Window 
{ 
    // keep a reference to the dialog 
    Dialog m_dlg; 

    public MainWindow() { 
     InitializeComponent(); 
    } 

    ... 

    private void createDialog() { 
     m_dlg = new Dialog(); 
     realign(); 
     m_dlg.Show(); 
    } 

    // change the dialog left and right when the main window moves: 
    private void Window_LocationChanged(object sender, EventArgs e) { 
     realign(); 
    } 

    private void realign() { 
     if(m_dlg != null) { 
      m_dlg.Left = this.Left + 30; 
      m_dlg.Top = this.Top + 30; 
     } 
    } 

    ... 
} 
相關問題