Тэги

Silverlight (36) WPF (10) IIS (7) Visual Studio (7) SharePoint (6) .Net Framework (5) ODP.NET (5) ASP.NET (4) C# (4) common (4) Network Settings (3) JavaScript (2) MS Office (2) Resharper (2) WCF (2) WEB (2) XPath (2) XSLT (2) ADO.NET (1) APEX (1) CMD (1) CSS (1) EF (1) HTML (1) Hardware bugs (1) Java (1) MS SQL (1) Oracle (1) PDF (1) Version Control (1) XAML (1)

пятница, 4 декабря 2009 г.

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



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

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

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

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

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

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

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

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

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


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

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