2010-04-06 329 views
4

我想從一個父控件移動到另一個(如果這將工作,我不太確定)。我可以抓住我想要移動的控制。這裏是我的代碼:「指定的可視已經是另一個Visual或CompositionTarget根的孩子」WPF FrameworkElement父和移動UIElement

public void MoveElement(UIElement uiElement) 
{ 
    var element = ((FrameworkElement)uiElement).Parent; 
    //TODO:Remove from parent 
    myControl.Children.Add(uiElement); 
} 

當我打到最後statment將引發ArgumentException聲明奇怪的是,Parent正在返回null。如何找到父母?這甚至會起作用嗎?

編輯:我不認爲實際移動元素是回答我的問題。我正在使用Visual Studio SDK,並能夠獲得組成編輯器窗格的UIElement(擴展DockPanel)。我試圖將控件從標準編​​輯器移動到我正在開發的自定義工具窗口中。

這被證明是一個黑客,我意識到我需要同一控件的多個實例,所以我認爲更復雜的解決方案(和更少的黑客)存儲。

回答

6

Parent屬性引用邏輯樹,文檔指出「在實例化元素但未附加到最終連接到頁級別根元素的任何邏輯樹的情況下,父元素可能爲空,或者應用程序對象「。例如,在ListBox中實例化的DataTemplate的根元素具有空的父級。

嘗試使用VisualTreeHelper.GetParent代替。可視化樹是WPF元素如何組織的較低級別的表示,並允許您訪問所有額外的「比特」,比如模板放在那裏。例如,在ListBox中實例化的DataTemplate的根元素上調用VisualTreeHelper.GetParent可返回ContentPresenter

請注意,僅僅因爲您可以獲得父視覺並不一定意味着您可以將其刪除。某些元素(例如面板)爲此提供了方法。但是,如果你找到的元素是CheckBox的一部分,我認爲你不能刪除它。

如果您可以通過移動可視化樹上的控件來爲您嘗試實現的內容提供更多的上下文,那麼人們可以提供更具體的建議或替代方法。

+0

請注意我編輯更新的信息。我不知道VisualTreeHelper存在。這應該有助於我確定父母。我不確定移動控制器實際上是我需要實現的。 – 2010-04-06 14:32:54