Главная » Silverlight » Индикатор фокуса

0

В предыдущем примере состояния Normal и MouseOver группы CommonStates исполь­зовались для изменения внешнего вида кнопки при наведении указателя. Можно также использовать состояния Pressed и Disabled для информирования пользователя о нажа­том или отключенном состоянии кнопки. Эти четыре состояния взаимоисключающие. Когда кнопка нажата, состояние MouseOver теряет смысл. Когда кнопка отключена, все другие состояния игнорируются, независимо от того, что пользователь делает мышью. Необходимо учитывать одну тонкость. Если не применить анимацию состояния, будет продолжено выполнение предыдущей анимации. Например, если не применить анима­цию состояния Pressed, анимация состояния MouseOver останется активной и после щелчка на кнопке.

Кнопка имеет две группы состояний. Кроме четырех состояний группы CommonStates, доступны два состояния группы FocusStates, позволяющие кнопке иметь или не иметь фокус. Группы CommonStates и FocusStates независимы. Это означает, что кнопка мо­жет иметь или не иметь фокус независимо от того, где находится указатель. Конечно, могут быть исключения, обусловленные внутренней логикой элемента управления.

Например, отключенная кнопка не может получить фокус клавиатуры, поэтому состоя­ние Focused не может быть установлено, когда активно состояние Disabled.

Состояния группы FocusStates используются для выяснения, имеет ли элемент управления фокус. В приведенном ниже шаблоне кнопки индикатор фокуса отобража­ется на экране с помощью объекта Rectangle с пунктирной рамкой. Индикатор фоку­са размещается поверх кнопки с помощью контейнера Grid, который содержит в одной ячейке как индикатор фокуса, так и рамку кнопки. Анимация группы FocusStates вы­водит или скрывает индикатор фокуса (пунктирный прямоугольник) путем настройки свойства Opacity.

<Grid>

<VisualStateManager .VisualStateGroups> <VisualStateGroup x: Name="FocusStates"> <VisualState x:Name="Focused"> <Storyboard> <DoubleAnimation Duration="0" Storyboard.TargetName="FocusVisualElement" Storyboard.TargetProperty="Opacity" To="l" /> </Storyboard> </VisualState>

<VisualState x:Name="Unfocused"> <Storyboard> <DoubleAnimation Duration="0" S toryboard.Targe tName="FocusVi sualElement" Storyboard.TargetProperty="Opacity" To="0" /> </Storyboard> </VisualState> </VisualStateGroup>

</VisualStateManager.VisualStateGroups>

<Border x:Name="ButtonBorder" …> <ContentPresenter … />

</Border>

<Rectangle x:Name="FocusVisualElement" Stroke="Black" Margin="8" 0pacity="0"

StrokeThickness=" 1" StrokeDashArray="l 2"X/Rectangle>

</Grid>

На кнопке отображается пунктирный прямоугольник, когда она имеет фокус клави­атуры. На рис. 13.5 показаны две кнопки на основе одного и того же шаблона. Верхняя кнопка имеет фокус, и на ней отображен индикатор фокуса.

Рис. 13.5. Создание индикатора фокуса с помощью шаблона

Не анимируйте одни и те же свойства в разных группах состояний. Например, ког­да анимирован цвет фона в состоянии Mouseover (группа CommonStates), нельзя ани- мировать этот же цвет фона в состоянии Focused (группа FocusStates). В этом случае результат будет зависеть от последовательности применения состояний. Например, если сначала применить состояние группы FocusStates, а затем состояние группы CommonStates, анимация состояния Focused будет активна лишь долю секунды, а затем будет замещена конкурирующим состоянием MouseOver.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии