2011-11-18 99 views
0

我現在有這行代碼,我想在所有案件工作:獲取窗口的視覺內容

var visualWindowContent = (UIElement)window.Content; 

時Window.Content是的UIElement這種方法將工作。但是,如果它是一個非可視對象,然後將DataTemplate應用到它上面呢?上面的代碼行會拋出一個糟糕的強制轉換異常。那麼如何在這種情況下獲得窗口的視覺內容?

編輯:起初我說VisualTreeHelper.GetChild(window,0)返回null,但它實際上是非null。我的目的是通過將visualWindowContent傳遞給AdornerLayer.GetAdornerLayer來獲得根adorner層。事實證明,由於該節點在視覺樹中不夠深,即AdornerDectorator的後代,因此在傳遞窗口的直接視覺子節點時失敗(返回null)。

回答

0

使用由@ReedCopsey鏈接的頁面FindVisualChild方法,這似乎工作:

var contentPresenter = FindVisualChild<ContentPresenter>(window); 
var visualWindowContent = (UIElement)VisualTreeHelper.GetChild(contentPresenter, 0); 
0

如果你想要的內容本身,你可以只使用對象:

object visualWindowContent = window.Content; 

這將適用於所有情況,作爲內容將實際分配的UIElement或對象。

如果你試圖尋找通過數據模板創建的內容,請參閱MSDN上Find DataTemplate-Generated Elements的選項。這是通過找到ContentPresenter並檢查它的ContentTemplate完成的。

+0

我想在所有情況下 – HappyNomad

+0

@HappyNomad編輯視覺到包括... –

+0

請在填寫問題標記: var cp = FindVisualChild (window); var visualWindowContent =(UIElement)cp.ContentTemplate.FindName(「???」,cp); – HappyNomad