2013-04-25 64 views
0

我已經創建了幾個的MenuItems(不XAML)所以我說他們的父項:如何將MenuItem附加到邏輯和可視樹中的父MenuItem?

(Parent_Menu as MenuItem).Items.Add(Menu_Item); 

然後我採用我的方式通過的VisualTree列表(循環)。但這些樣式不適用於新的MenuItems。這是我的風格應用代碼:

else if (Visual is MenuItem) 
{ 
    MenuItem menuItem = Visual as MenuItem; 
    menuItem.Style = D_Interface.Style_Menu; 
} 

父菜單項獲得樣式,但不是新的子菜單項。 所以我只是用調試器檢查哪些項目通過可視化樹鏈接到父項目,而我無法在父項目中找到新的子項目。我想他們沒有鏈接到邏輯樹中的父項。

我檢查了新子項目在全局視覺\邏輯樹中的位置,正如我從調試器中瞭解到的,它們沒有鏈接到任何不在視覺樹中的父項,也沒有在邏輯樹中,甚至沒有鏈接到窗口本身。

我的結論是,他們只與「Items」列表有關的父MenuItem ...它不是像MenuItems自動作爲父菜單控件的孩子一樣。

有沒有人有想法如何使動態創建的MenuItems成爲可視化樹中父級的子級?

回答

1

將添加到ItemsControl的Items集合(MenuItem是ItemsControl)的對象作爲該ItemsControl的邏輯子項添加。我認爲問題在於你正在爲MenuItem提供一個隱式的Style。你只是明確地設置父母的風格,但不會影響子孫。你可以設置ItemContainerStyle,這會影響直接的孩子(但不會影響他們的孩子),或者更好地將樣式放入MenuItem或其祖先的某個資源(不設置鍵)。

+0

我無法從VisualTree的循環中獲取新的MenuItem ..問題是,新的MenuItem沒有找到他的父母的孩子。而不是在新的MenuItem上應用樣式。例如,在VisualTree中找到其他現有的menuItem,所以它們的樣式被應用並且確實起作用。所以再次,問題是爲什麼新的MenuItems不在他們父母的VisualTree中?和如何插入它們? Items.Add不會在VisualTree中鏈接它們,我想知道爲什麼? – Lispwave 2013-04-26 07:39:24

+0

MenuItem的子項顯示在父菜單項的Popup中,因此子項絕不會在技術上處於相同的可視化樹中(它們是不同的HwndSource的一部分)。你不是在說你在做什麼,而是聽起來你正在走下視覺樹來影響元素。如果是這樣,那麼你將不得不沿着邏輯樹走下去,或者當你在可視化樹中輸入一個Popup時,也會遍歷它的子節點。不過,我懷疑你仍然可以在視覺樹中發現中斷,因爲通常它不會在第一個度量和模板被應用之前創建。 – AndrewS 2013-04-26 12:38:11

+0

所以我應該把樣式放在Menu_Main的資源中? 但無論如何,我可以得到一個菜單(所有的項目)至少由邏輯樹循環的孩子?或讓另一個助手枚舉MenuItems(通過它們的.Items集合)? – Lispwave 2013-04-26 15:19:06

相關問題