2010-07-01 9 views
10

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

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

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

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

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

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

ответ

22

Я тоже борюсь с этим. Я обнаружил, что решение заключается в «переопределении» system parameter that control popup animation.

ли это путь определения ресурса (возможно, в вашем Themes\Generic.xaml), как это:

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

Спасибо, это именно то, что я искал! Woo! Счастливый день. – scobi

0

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

+0

Как я сказал выше, ContextMenu отличается. То, что объяснял Роб, было привязкой внутри шаблона MenuItem, который напрямую запрашивал ОС для флага, должен ли он анимироваться или нет. В этом случае в классе Popup есть код, выполняющий работу. И хотя шаблон для MenuItem включает анимацию, которую легко отключить при переопределении шаблона, ContextMenu помещается внутри этого всплывающего окна что-то внутри WPF. Мне нужен способ получить доступ к его всплывающей подсказке во время построения, чтобы убить анимацию, но не могу понять, откуда она взялась или как ее изменить. – scobi

5

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

var app = new Application(); 
app.Resources.Add(SystemParameters.MenuPopupAnimationKey, PopupAnimation.None); 
app.Run(myThing); 
Смежные вопросы