Silverlight: Динамическое изменени цвета шрифта вместе с фоном в перекрестных состояниях – только два подхода



Ребята, не читайте, пожалуйтста, дальше, если вы не втеме.
Будет надо, Гугл вас сам сюда приведет.

Поехали:
То что в CSS и HTML стоит 2 копейки может превратиться в Silverlight в головную боль.

Задача: при наведении мыши изменить бэграунд и цвет шрифта.
Обычное состояние: Светлый фон и темный шрифт
Состояние при наведенной мыши или выделенного элемента: меняем на темный фон и светлый шрифт.
Теперь загвоздка – при уходе мыши, если элемент выбран, нужно сохранить состояние выделенности (Темный фон, свелый шрифт).

Конечно в HTML через CSS мы это сделаем без анимации, но просто и быстро. Мы меняем или добавляем втророй класс CSS, например, и все фиксируется и при уводе мыши состояние выделенности не меняется. Ну еще много вариантов, но не в этом соль.

Сильверлайт это всетаки не WPF, поэтму возникают сложности, т.к. в Silverllight это работает на визуальрных состояниях и переходах (транзишеннах - вроде называется).
Поскольку состояния наведения и увода мыши, а также выделения элемента находиться в разных визуальных группах, то эти состояния могут появлятся одновременно и перекрываться, что приводит к тому, что у выделенного элемнта, при уводе мыши проподает его View выделенности, т.е. возвращается светлый фон и темный шрифт, как в обычном состоянии.

Стыдно признать, что нет для такого простого и частого дизайнерского приема стандартного решения в Silverlight.
Вернее оно есть и называется “перепрограммировать чужой непродуманный элемент”. Фу.

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

  • В лоб – в шаблоне контрола разместить два текстовых элемента, один над другим. Один управлять из визуальных состояний мыши, другим из стостояний Selected.
    Это работае :) Производительность не страдает. Это вам не DataGrid с 1000 стороками рисоват, поэтому все хорошо, конечно если вы не стилизируете таки DataGrid с 1000 строками кода.

  • Программерское решение – управление состояниями выделенности мы оставляем неизменными, на совести XAML разметки.
    А управление сстояниями наведением мыши переносим в код. Я для этого применяю своей кастомизированный ContentControl. В нем я анализирую IsSelected и реагирую на наведение и уход мыши.


Комментарии

Популярные сообщения из этого блога

A4tech. Мышь не найдена. Пожалуйста, подсоедините мышь.

SVN: Пропали иконки TortoiseSVN.

Вывод в cmd или bat пустой строки.