Как отключить WPF ContextMenu анимации? - PullRequest
11 голосов
/ 01 июля 2010

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

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

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

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

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

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

Ответы [ 3 ]

25 голосов
/ 20 мая 2011

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

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

<PopupAnimation x:Key="{x:Static SystemParameters.MenuPopupAnimationKey}">None</PopupAnimation>
5 голосов
/ 14 января 2013

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

var app = new Application();
app.Resources.Add(SystemParameters.MenuPopupAnimationKey, PopupAnimation.None);
app.Run(myThing);
0 голосов
/ 01 июля 2010

В вашем предыдущем вопросе Роб показал вам причину такого поведения. Не можете ли вы создать новый 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, используя показанный код к конкретным экземплярам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...