Подтвердить что ты не робот

Как отключить анимацию WPF ContextMenu?

Я пытаюсь выследить, какой бит мне нужно настроить, чтобы ContextMenus в WPF прекратил анимацию, когда они появляются/исчезают.

Из того, что я могу сказать, WPF создает Popup для размещения ContextMenu. Popup просматривает свойство PopupAnimation и решает, как оживить. То, что я хочу сделать, всегда имеет значение "Нет".

Я попытался установить глобальный неназванный стиль с TargetType Popup, который устанавливает PopupAnimation в None, но это не работает. Если я нарушу System.Windows.Controls.Primitives.Popup.SetupAnimations, я вижу, что тип анимации по-прежнему установлен в Fade. Я предполагаю, что у него еще не было возможности применять стили еще.

Я попытался подключить ContextMenuOpening, но там нет доступа к всплывающему окну, который я мог найти.

Что еще я мог попробовать?

Обратите внимание, что это уже вторая часть другого вопроса, который я задал здесь . Совет там отлично поработал для меню и всего остального, что у нас было, что было оживление, но единственным исключением был ContextMenus. Они анимируются на основе свойств кода, а не шаблона. Я проверил это, вытащив шаблон ContextMenu с помощью совета здесь.

4b9b3361

Ответ 1

Я тоже борется с этим. Я обнаружил, что решение состоит в том, чтобы "переопределить" системный параметр который управляет всплывающей анимацией.

Сделайте это, указав ресурс (возможно, в вашем Themes\Generic.xaml) следующим образом:

<PopupAnimation x:Key="{x:Static SystemParameters.MenuPopupAnimationKey}">None</PopupAnimation>

Ответ 2

Я потратил полчаса, пытаясь понять, как это сделать в коде - я уверен, что это очевидно, если вы знаете структуру лучше:

var app = new Application();
app.Resources.Add(SystemParameters.MenuPopupAnimationKey, PopupAnimation.None);
app.Run(myThing);

Ответ 3

В предыдущем вопросе Rob показал вам причину, по которой он действует так. Не можете ли вы создать новый ControlTemplate для своего ContextMenu и установить для свойства PopupAnimation значение None следующим образом:

               <Popup x:Name="PART_Popup" 
                   AllowsTransparency="true" 
                   Focusable="false" 
                   HorizontalOffset="-2" 
                   IsOpen="{Binding IsSubmenuOpen, 
                            RelativeSource={RelativeSource TemplatedParent}}" 
                   PopupAnimation="None" 
                   Placement="Right" 
                   VerticalOffset="-3">

Вы можете создать свой собственный ContextMenu или применить ControlTemplate с помощью показанного кода к конкретным экземплярам.