2010-07-01 29 views
10

Tôi đang cố gắng tìm kiếm những gì mình cần để tinh chỉnh ContextMenus trong WPF để ngừng hoạt ảnh khi chúng xuất hiện/biến mất.Làm thế nào để vô hiệu hóa WPF ContextMenu hình ảnh động?

Từ những gì tôi có thể biết, WPF tạo Cửa sổ bật lên để lưu trữ ContextMenu. Popup xem xét thuộc tính PopupAnimation của nó và quyết định cách tạo hiệu ứng động. Những gì tôi muốn làm là luôn luôn có mà thiết lập để "Không".

Tôi đã thử đặt kiểu ẩn danh chung với Loại mục tiêu bật lên đặt PopupAnimation thành None nhưng điều này không hoạt động. Nếu tôi phá vỡ trong System.Windows.Controls.Primitives.Popup.SetupAnimations tôi có thể thấy rằng các loại hình ảnh động vẫn được thiết lập để mờ dần. Tôi đoán rằng nó chưa có cơ hội áp dụng kiểu dáng nào ..

Tôi đã cố gắng hooking ContextMenuOpening nhưng không có quyền truy cập vào Cửa sổ bật lên ở đó mà tôi có thể tìm thấy.

Tôi còn có thể thử những gì khác?

Lưu ý rằng đây là phần thứ hai của câu hỏi khác mà tôi đã hỏi here. Lời khuyên đã làm việc rất tốt cho các menu và mọi thứ khác mà chúng tôi đã có đó là hoạt hình, nhưng một ngoại lệ là ContextMenus. Chúng hoạt ảnh dựa trên các thuộc tính trong mã, không phải mẫu. Tôi đã xác minh điều này bằng cách kéo mẫu ContextMenu ra bằng cách sử dụng lời khuyên cho here.

Trả lời

22

Tôi cũng đang đấu tranh với điều này. Tôi đã tìm thấy giải pháp là "ghi đè" số system parameter that control popup animation.

Làm điều này bằng cách định nghĩa một nguồn lực (có lẽ trong Themes\Generic.xaml của bạn) như thế này:

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

Cảm ơn bạn đây chính xác là những gì tôi đang tìm kiếm! Woo! Ngày hạnh phúc. – scobi

0

Trong câu hỏi trước, Rob cho bạn biết lý do tại sao nó hoạt động như thế. bạn có thể không tạo ra một ControlTemplate mới cho ContextMenu của bạn và thiết lập PopupAnimation tài sản để None như sau:

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

Bạn có thể tạo riêng của bạn ContextMenu hoặc áp dụng một ControlTemplate sử dụng mã chứng minh trường hợp cụ thể.

+0

Như tôi đã nói ở trên, ContextMenu là khác nhau. Những gì Rob giải thích là một ràng buộc bên trong của mẫu MenuItem trực tiếp yêu cầu hệ điều hành cho một lá cờ cho dù nó nên animate hay không. Trong trường hợp này, có mã trong lớp Popup đang thực hiện công việc. Và trong khi mẫu cho một MenuItem bao gồm các hình ảnh động mà rất dễ dàng để vô hiệu hóa trong một mẫu ghi đè lên, ContextMenu được đặt bên trong của Popup đó bởi một cái gì đó bên trong của WPF. Tôi cần một cách để truy cập Popup có chứa của nó tại thời điểm xây dựng để giết các hình ảnh động, nhưng không thể tìm ra nơi nó đến từ hoặc làm thế nào để thay đổi nó. – scobi

5

tôi đã dành một nửa giờ tốt cố gắng tìm ra cách để làm điều này trong mã - Tôi chắc chắn rõ ràng của nó nếu bạn biết khuôn khổ tốt hơn:

var app = new Application(); 
app.Resources.Add(SystemParameters.MenuPopupAnimationKey, PopupAnimation.None); 
app.Run(myThing); 
Các vấn đề liên quan