2010-07-01 14 views
10

Estoy tratando de buscar qué bits necesito ajustar para que ContextMenus en WPF deje de animar cuando aparecen/desaparecen.Cómo deshabilitar las animaciones WPF ContextMenu?

Por lo que puedo decir, WPF crea una ventana emergente para alojar el ContextMenu. Popup mira su propiedad PopupAnimation y decide cómo animar. Lo que quiero hacer es tener siempre ese conjunto en "Ninguno".

He intentado configurar un estilo global sin nombre con un TargetType de Popup que establece PopupAnimation en None pero esto no funciona. Si rompo en System.Windows.Controls.Primitives.Popup.SetupAnimations puedo ver que el tipo de animación aún está configurado en Fade. Supongo que aún no ha tenido oportunidad de aplicar estilos.

He intentado conectar ContextMenuOpening pero no hay acceso a una ventana emergente que pueda encontrar.

¿Qué más podría probar?

Tenga en cuenta que este es el tipo de la segunda parte de otra pregunta que hice here. El consejo allí funcionó de maravilla para los menús y todo lo demás que teníamos que animaba, pero la única excepción fue ContextMenus. Se animan basándose en propiedades en código, no en una plantilla. Lo verifiqué tirando de la plantilla ContextMenu usando el consejo dado here.

Respuesta

22

He estado luchando con esto también. Descubrí que la solución es "anular" el system parameter that control popup animation.

hacer esto definiendo un recurso (tal vez en su Themes\Generic.xaml) así:

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

¡Gracias, esto es exactamente lo que estaba buscando! ¡Cortejar! Día feliz. – scobi

0

En su pregunta anterior, Rob le mostró el motivo por el que actúa así. no se puede crear un nuevo ControlTemplate para su ContextMenu y establecer PopupAnimation propiedad a None como la siguiente:

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

Usted puede crear su propia ContextMenu o aplicar un ControlTemplate utilizando el código que se muestra a casos específicos.

+0

Como dije anteriormente, ContextMenu es diferente. Lo que Rob explicaba era un enlace dentro de la plantilla MenuItem que le pedía directamente al sistema operativo que marcara si debería animarse o no. En este caso, hay un código en la clase Popup haciendo el trabajo. Y mientras que la plantilla para un elemento de menú incluye la animación que es fácil de desactivar en una anulación de plantilla, ContextMenu se coloca dentro de esa ventana emergente por algo dentro de WPF. Necesito una forma de acceder a su ventana emergente que contiene Popup en el momento de la construcción para matar la animación, pero no puedo averiguar de dónde viene ni cómo alterarla. – scobi

5

yo pasamos una buena media hora tratando de encontrar la manera de hacer esto en código - Estoy seguro de que su evidente si usted conoce mejor el marco:

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