2012-06-27 87 views
1

我知道這已被問到之前(Get Absolute Position of element within the window in wpf),但我還沒有能夠正確實施。我試圖在父窗口中打開一個相對於控件的子窗口。到目前爲止,我有這個;子窗口定位

messageWindow = new Message(true); 
Point relativePoint = btn1.TransformToAncestor(this).Transform(new Point(0, 0)); 
messageWindow.Left = relativePoint.X; 
messageWindow.Top = relativePoint.Y; 
messageWindow.Show(); 

現在雖然這並不影響子窗口(messageWindow)的位置,它似乎並沒有把它放在/父的btn1控制旁邊。我的另一個問題是,如果我移動父窗口,然後回想一下已關閉原始窗口的新方法(即使btn1處於新位置),窗口的新實例將顯示在舊位置。我覺得這很奇怪,想知道是否有人可以幫我解決這個問題。

UPDATE

感謝Charleh解釋,我只是將它們設置相對於控制位置的窗口,而不是整個屏幕。所以,現在是在屏幕上獲取父窗口的位置並將其添加到XY的問題。我怎麼得到這個?剛剛嘗試過這個代碼(雖然我會說實話,我不太明白),但總線似乎並不是非常密切。在屏幕上獲取窗口位置的好方法是什麼?

messageWindow= new Message(true); 
Point relativePoint = btn1.TransformToAncestor(this).Transform(new Point(0, 0)); 
PresentationSource ScreenPos = PresentationSource.FromVisual(this); 

messageWindow.Left = relativePoint.X + (96.0 * ScreenPos.CompositionTarget.TransformToDevice.M11); 
messageWindow.Top = relativePoint.Y + (96.0 * ScreenPos.CompositionTarget.TransformToDevice.M22); 
messageWindow.Show(); 
+1

您是否考慮了父窗口的座標?這隻給出了子窗口的相對位置 - 不是絕對位置,這聽起來像需要將子窗口放在與父窗口相同的位置,然後使用relativePoint – Charleh

+0

@Charleh Oh ya進行轉換。這很有道理,爲什麼它不隨父母移動。謝謝! – windowskm

回答

2

relativePoint是控制的相對Window的位置,而不是在屏幕上。當設置LeftRight點數爲messageWindow(子窗口)時,點數爲,相對於爲屏幕,而不是父窗口。

爲了獲得正確的位置,你需要找到父窗口的位置,然後做一些數學運算來找到控件相對於屏幕的位置,而不是窗口應該給你的位置您想放置子窗口的位置。

+0

聽起來不錯,我如何獲得窗口在屏幕上的位置? – windowskm

+1

'this.Top'和'this.Left'將獲得與桌面(屏幕)相關的窗口的頂部/左側邊緣。 –

+0

呃!想想我今天半睡着了......謝謝:D – windowskm