Страницы

Поиск по вопросам

вторник, 7 января 2020 г.

Изучение WPF (Анимация кнопки при наведении курсора мышки)

#c_sharp #wpf


Доброго времени суток, Хешкодовцы

В продолжение предыдущего моего вопроса по поводу анимации с использованием триггеров. 

Хочется сделать анимацию цветом при наведении курсора мышки на кнопку.
Для этого разработал стиль, который должен применяться при наведении мышки на кнопку.
Но тут появилось 2 проблемы:


Как применить стиль к кнопки при срабатывании триггера? Что-то никак не получается.
Если не использовать стиль, то происходит нечто странное: триггер срабатывает и фон
кнопки красится в желтый цвет (ну так и задумано), но после этого практически сразу
(менее чем через секунду) он заливается ярко-серым градиентом, как будто где-то перекрывается
моя анимация еще какой-то. Как это можно отследить, кто перекрывает мои стили?.. 


Заранее спасибо за Вашу помощь.



Update

Ну вот и опять появилось время для самообучения. Попытался вспомнить, на чем остановился,
еще нашел неплохую статью в MSDN, делаю аналогично, но другие стили, и на тригерах
опять столкнулся с проблемой. То ли читаю криво, то ли в windows 7 как-то особенно
получается.

В общем суть проблемы как было написано раньше осталась. Код XAML:


    
        
    
    
        
    



А вот результат. Изначально окно с растянутой кнопкой:



После наведения курсора мышки:



Убрали курсор мышки:



Итого видим, что изначальный цвет соответствует задуманному, окончательный цвет должен
был появиться при наведении курсора, однако в момент наведения курсора видим какие-то
стили от семёрки. Ну и окончательный вариант соответствует ожиданию, так как не обрабатываем
уход курсора.

В общем, где я проглядел что-то?
    


Ответы

Ответ 1



Смотрите, в чём дело. Стиль для Button определяется примерно так, как в этом примере: http://msdn.microsoft.com/en-us/library/ms753328.aspx. Вы видите, что анимация на MouseOver реализована в переопределённом ControlTemplate через VisualStateManager (почитайте про него, полезная штука). Что происходит на самом деле: срабатывает ваш триггер и переключает Background срабатывает VisualStateManager, переходит в состояние CommonStates.MouseOver, и применяет поверх ваших изменений свои вычисленные значения (которые определены в Template, унаследованном от системного стиля.) То есть так сделать не получится, т. к. два фрагмента кода «сражаются» за цвет фона. Мораль отсюда такова: если уж меняете стиль контрола, перекрывайте его полностью. Или пользуйтесь выставленными наружу свойствами, это предусмотренные дизайном точки кастомизации.

Комментариев нет:

Отправить комментарий