2012-03-02 3 views
2

Я хотел бы вызвать изменение в шаблоне Button, чтобы дополнить эффекты FocusVisualStyle. В основном я хочу текст «Foo» в приведенном ниже фрагменте кода, чтобы включить красный тогда и только тогда, когда FocusVisualStyle видна:Как кнопки WPF решают показать FocusVisualStyle?

<Style x:Key="ButtonStyle1" TargetType="{x:Type Button}"> 
    <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type Button}"> 
       <Grid> 
        <ContentPresenter/> 
        <TextBlock x:Name="TxtFoo" Text="foo" Foreground="Black"/> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsKeyboardFocused" Value="true"> 
         <Setter Property="Foreground" TargetName="TxtFoo" Value="Red"/> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

Пожалуйста, игнорировать тот факт, что пример является идиотским, фактический код является более полезным (он изменяет путь).

Это работает при навигации по клавиатуре, но имеет проблему: текст становится красным и при нажатии кнопки (FocusVisualStyle в этом случае не отображается). Использование eventTrigger в GotKeyboardFocus/LostKeyboardFocus дает тот же результат.

Глядя на исходный код рамки, я не вижу ничего особенного: KeyboardNavigation.ShowFocusVisual() вызывается FrameworkElement.OnGotKeyboardFocus(), как и ожидалось. Однако, очевидно, должно произойти что-то еще, потому что не каждое событие gotKeyboardFocus вызывает отображение FocusVisualStyle.

Какое свойство/событие следует настроить, если я хочу «синхронизироваться» с FocusVisualStyle?

ответ

1

Глупый вопрос может быть, но почему бы вам просто не скопировать FocusVisualStyle (в Blend) и отредактировать его, чтобы отобразить то, что вы хотите? Так мы обычно это делаем.

Приветствия, Laurent

+0

Я не могу использовать FocusVisualStyle, потому что это добавляет дополнительный слой над кнопкой (шаблон по умолчанию - это только пунктирная граница). Все сеттеры в FocusVisualStyle нацелены на дополнительный слой. Однако в этом случае я должен взаимодействовать с самим контролем. В примере «foo» работает жестко, на самом деле я изменяю содержимое фактической кнопки. Имеет ли это смысл? –

+1

Я вижу. Я не могу попробовать прямо сейчас, но откройте шаблон управления Button в Blend и проверьте визуальные состояния или триггеры. Найдите Focused и проверьте, что они делают в шаблоне. Лучший способ ИМХО состоит в том, чтобы иметь два слоя, и когда Focused, чтобы скрыть Content One и показать Focus. Имеет смысл? – LBugnion

+0

Делает смысл. Шаблон wpf по-прежнему не основан на Visual State Manager, но это не составит труда сделать это (возможно, начиная с шаблона Silverlight). Спасибо за совет! –

0

Вместо использования IsKeyboardFocused попробовать IsFocused.

Смежные вопросы