【问题标题】:How to attach MenuItem to parent MenuItem in logical and visual trees?如何在逻辑树和可视树中将 MenuItem 附加到父 MenuItem?
【发布时间】:2013-04-20 00:41:42
【问题描述】:

我创建了几个 MenuItems(不是在 XAML 中)所以我将它们添加到父项:

( 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;
}

父菜单项获得了样式,但没有新的子菜单项。 所以我只是用调试器检查了哪些项目通过可视化树链接到父项目,我在父项目中找不到新的子项目。我猜它们在逻辑树中也没有链接到父级。

我检查了新子项在全局视觉\逻辑树中的位置,正如我从调试器中了解到的那样,它们没有链接到任何不在视觉树中的父项,也不在逻辑树中,甚至没有链接到窗口本身.

我的结论是它们仅通过“项目”列表与父 MenuItem 相关......这与 MenuItems 自动成为父 Menu 控件的子控件不同。

有人知道如何使动态创建的 MenuItems 成为可视树中父级的子级吗?

【问题讨论】:

    标签: c# wpf menuitem visual-tree logical-tree


    【解决方案1】:

    添加到 ItemsControl(MenuItem 是 ItemsControl)的 Items 集合的对象将作为该 ItemsControl 的逻辑子级添加。我认为问题在于您为 MenuItem 提供了隐式样式。您只是明确设置父级的样式,但这不会影响后代。您可以设置 ItemContainerStyle ,这将影响直接子项(但不影响他们的子项),或者最好将样式放入 MenuItem 或其祖先之一的资源中(无需设置键)。

    【讨论】:

    • 我无法从 VisualTree 的循环中获取新的 MenuItem .. 问题是新的 MenuItem 没有作为其 parent 的子项找到。并且不要在新的 MenuItem 上应用样式。例如,在 VisualTree 中可以找到其他现有的 menuItem,因此应用了它们的样式并且确实有效。再次如此,问题是为什么新的 MenuItems 不在其父级的 VisualTree 中?以及如何插入它们? Items.Add 没有在 VisualTree 中链接它们,我想知道为什么?
    • MenuItem 的子项显示在父菜单项的 Popup 中,因此从技术上讲,子项永远不会位于同一可视树中(它们是不同 HwndSource 的一部分)。你不是在说你在做什么,但听起来你是在沿着视觉树走来影响元素。如果是这样,那么您也将不得不沿着逻辑树向下走,或者当您在可视化树中输入 Popup 时,也必须向下遍历它的 Child。但是我怀疑您可能仍然会在可视化树中发现中断,因为通常直到第一次测量并应用模板时才会创建它。
    • 所以我应该把样式放在 Menu_Main 的资源中吗?但无论如何,我可以通过逻辑树循环至少获得菜单的子项(所有项目)吗?或者制作另一个 Helper 来枚举 MenuItems(通过他们的 .Items 集合)?
    • 正如我在原始答案中提到的,您添加到 ItemsControl 的 Items 集合中的内容位于其逻辑树中,因此是的,您可以枚举任何项目控件的逻辑树,包括 MenuItem。但是是的,如果您只是想为 MenuItem 定义一个影响所有菜单项的样式,那么我会将该样式放入 Menu 或其他祖先的资源中(没有 x:Key)。
    猜你喜欢
    • 2012-07-05
    • 1970-01-01
    • 2017-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多