Это будет плохой пользовательский опыт с 1 тыс. Элементов на одном уровне, но вопрос о том, как сделать контекстные меню с большим количеством дорогих элементов более отзывчивым, - справедливый вопрос.
Общий шаблон, который я использую, - это изначально создать мое меню с фиктивными подменю. Подменю-пустышка содержат один элемент меню заполнителя, и я перехватываю событие открытия подменю. В обработчике событий я удаляю элемент меню заполнителя и добавляю реальные элементы.
Этот шаблон позволяет создавать подменю по требованию и только в том случае, если подменю действительно открыто. Другими словами, это делает ваше меню динамичным, то есть вам не нужно создавать все заранее и создавать сотни подменю, которые не будут открыты.
Этот шаблон уменьшит исходное количество пунктов меню с 10 000 пунктов до 1 000 для примера выше. Это должно привести вас к ~ 1 секунде.
Опять же, 10k пунктов меню с 1k в корне в значительной степени непригодны для UX. Надеюсь, это всего лишь мысленный эксперимент! :)
Пример
ContextMenu cm = new ContextMenu();
for (int i = 0; i < 1000; i++)
{
MenuItem mi = new MenuItem();
mi.Header = "test";
mi.Tag = this;
object dummySub = new object();
mi.Items.Add(dummySub);
cm.Items.Add(mi);
mi.SubmenuOpened += delegate
{
mi.Items.Clear();
for (int j = 0; j < 10; j++)
{
MenuItem mi2 = new MenuItem();
mi2.Header = "test";
mi2.Tag = this;
mi.Items.Add(mi2);
}
};
}
cm.IsOpen = true;