Как отключить анимацию WPF ContextMenu?
Я пытаюсь выследить, какой бит мне нужно настроить, чтобы ContextMenus в WPF прекратил анимацию, когда они появляются/исчезают.
Из того, что я могу сказать, WPF создает Popup для размещения ContextMenu. Popup просматривает свойство PopupAnimation и решает, как оживить. То, что я хочу сделать, всегда имеет значение "Нет".
Я попытался установить глобальный неназванный стиль с TargetType Popup, который устанавливает PopupAnimation в None, но это не работает. Если я нарушу System.Windows.Controls.Primitives.Popup.SetupAnimations, я вижу, что тип анимации по-прежнему установлен в Fade. Я предполагаю, что у него еще не было возможности применять стили еще.
Я попытался подключить ContextMenuOpening, но там нет доступа к всплывающему окну, который я мог найти.
Что еще я мог попробовать?
Обратите внимание, что это уже вторая часть другого вопроса, который я задал здесь . Совет там отлично поработал для меню и всего остального, что у нас было, что было оживление, но единственным исключением был ContextMenus. Они анимируются на основе свойств кода, а не шаблона. Я проверил это, вытащив шаблон ContextMenu с помощью совета здесь.
Ответы
Ответ 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
с помощью показанного кода к конкретным экземплярам.