WPF ContextMenu — как отключить fade effect при открытии/закрытии меню.

По какой то странной причине в некоторых WPF приложениях очень медленно открывается контекстное меню. Может быть кто то подскажет мне почему? Эффекты меню задаются глобально для всей системы. Однако не хочется их отключать из за одного приложения. WPF не предлагает способа отключать анимацию меню в рамках приложения стандартными способами. Но есть одно простое решение, позволяющее это сделать.Для этого нужно понять чем по сути является контекстное меню. А является оно Popup окном в котором расположены контролы, описывающие элементы меню. Анимация меню это на самом деле анимация этого Popup окна. Если мы сможем каким либо образом отменить анимацию для Popup мы получим требуемый результат.

Вот пример того, как отключить fade effects:

public Window1()
{
    InitializeComponent();
    ContextMenu myMenu = new ContextMenu();
    MenuItem myItem = new MenuItem();
    myItem.Header = "test";
    myMenu.Items.Add(myItem);
    myMenu.IsVisibleChanged +=
        new DependencyPropertyChangedEventHandler(myMenu_IsVisibleChanged);
}
void myMenu_IsVisibleChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    ContextMenu menu = sender as ContextMenu;
    Popup myParentPopup = menu.Parent as Popup;
    myParentPopup.PopupAnimation = PopupAnimation.None;
}

Думаю тут все прозрачно. На событие «проявления» меню (IsVisibleChanged) мы вызываем процедуру, которая находит для нашего меню его родительское Popup окно и заменяет анимацию, используемую по умолчанию на «пустышку», которая не оказывает никакого влияния на отображение окна. В результате меню появляется очень быстро и неприятная задержка от которой так хотелось избавиться больше не наблюдается.

Надеюсь этот прием окажется полезным в вашей работе.

Ссылка на источник

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *