【发布时间】:2012-03-02 13:50:29
【问题描述】:
我想触发 Button 模板的更改以补充 FocusVisualStyle 效果。基本上我希望下面 sn-p 中的文本“foo”变成红色当且仅当 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)。在 GotKeyboardFocus/LostKeyboardFocus 上使用 eventTrigger 会产生相同的结果。
查看框架的源代码,我没有看到任何特别之处:KeyboardNavigation.ShowFocusVisual() 按预期由FrameworkElement.OnGotKeyboardFocus() 调用。但是,显然肯定有其他事情发生,因为并非每个 gotKeyboardFocus 事件都会导致 FocusVisualStyle 显示。
如果我想与 FocusVisualStyle“同步”,我应该定位哪些属性/事件?
【问题讨论】: