Я хотел бы вызвать изменение в шаблоне 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?
Я не могу использовать FocusVisualStyle, потому что это добавляет дополнительный слой над кнопкой (шаблон по умолчанию - это только пунктирная граница). Все сеттеры в FocusVisualStyle нацелены на дополнительный слой. Однако в этом случае я должен взаимодействовать с самим контролем. В примере «foo» работает жестко, на самом деле я изменяю содержимое фактической кнопки. Имеет ли это смысл? –
Я вижу. Я не могу попробовать прямо сейчас, но откройте шаблон управления Button в Blend и проверьте визуальные состояния или триггеры. Найдите Focused и проверьте, что они делают в шаблоне. Лучший способ ИМХО состоит в том, чтобы иметь два слоя, и когда Focused, чтобы скрыть Content One и показать Focus. Имеет смысл? – LBugnion
Делает смысл. Шаблон wpf по-прежнему не основан на Visual State Manager, но это не составит труда сделать это (возможно, начиная с шаблона Silverlight). Спасибо за совет! –