2013-04-25 51 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