Как прикрепить MenuItem к родительскому MenuItem в логических и визуальных деревьях?

Я создал несколько элементов MenuItem (не в 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.

Кто-нибудь знает, как сделать динамически создаваемые элементы меню дочерними элементами родительского элемента в визуальном дереве?


person David von Tamar    schedule 25.04.2013    source источник


Ответы (1)


Объекты, которые добавляются в коллекцию Items элемента управления ItemsControl (MenuItem является элементом управления ItemsControl), добавляются как логические дочерние элементы этого элемента управления ItemsControl. Я думаю, проблема в том, что вы предоставляете неявный стиль для MenuItem. Вы просто явно устанавливаете стиль родителя, но это не повлияет на потомков. Вы можете установить ItemContainerStyle, и это повлияет на прямые дочерние элементы (но не их дочерние элементы), или, что еще лучше, просто поместите стиль в ресурсы MenuItem или одного из его предков (без установки ключа).

person AndrewS    schedule 26.04.2013
comment
Я не могу получить новый MenuItem в цикле из VisualTree. Проблема в том, что новый MenuItem не найден как дочерний элемент его родителя. И не применять стиль к новому MenuItem . Например, другие существующие элементы меню находятся в VisualTree, поэтому применяется их стиль, и это сработало. ТАК снова, проблема в том, почему новые элементы меню не находятся в VisualTree их родителя? И как их вставлять? Items.Add не связывает их в VisualTree, и мне интересно, почему? - person David von Tamar; 26.04.2013
comment
Дочерние элементы MenuItem отображаются во всплывающем окне родительского элемента меню, поэтому технически дочерние элементы никогда не находятся в одном визуальном дереве (они являются частью другого HwndSource). Вы не говорите, что делаете, но это звучит так, как будто вы спускаетесь по визуальному дереву, чтобы воздействовать на элементы. Если это так, вам также придется пройтись по логическому дереву или, когда вы вводите всплывающее окно в визуальном дереве, также переходите к его дочернему элементу. Однако я подозреваю, что вы все еще можете найти разрывы в визуальном дереве, потому что обычно оно не создается до тех пор, пока не будет применена первая мера и шаблон. - person AndrewS; 26.04.2013
comment
Итак, я должен поместить стиль в ресурсы Menu_Main? Но в любом случае, могу ли я получить дочерние элементы меню (все его элементы), по крайней мере, с помощью цикла логического дерева? Или сделать еще один помощник для перечисления элементов меню (по их коллекциям .Items)? - person David von Tamar; 26.04.2013
comment
Как я уже упоминал в своем первоначальном ответе, вещи, которые вы добавляете в коллекцию Items ItemsControl, находятся в его логическом дереве, поэтому да, вы можете перечислить логическое дерево любых элементов управления элементами, включая MenuItem. Но да, если вы просто пытаетесь определить один стиль для MenuItem, который влияет на все пункты меню, я бы поместил этот стиль в меню или ресурсы какого-либо другого предка (без x: Key). - person AndrewS; 26.04.2013