在UWP中,有一个系统级焦点视觉应用于Button
以及许多其他默认控件。如果您想像您在中定义的那样管理自己的焦点视觉Focused
视觉状态,尝试设置
<Setter Property="UseSystemFocusVisuals" Value="False" />
以你的风格。
另外,自定义焦点视觉状态是not inside CommonStates
but FocusStates
。所以你需要将你的焦点状态移到里面
<VisualStateGroup x:Name="FocusStates">
<VisualState x:Name="Focused">
<VisualState.Setters>
<Setter Target="ContentPresenter.Foreground" Value="Purple" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unfocused" />
</VisualStateGroup>
Update
当您想保持对点击的关注时,您需要两件事。首先,你需要AllowFocusOnInteraction
set to True
。默认情况下,它已经True
on a Button
。其次,你要处理PointerFocused
状态连同Focused
一。因此,将您的焦点状态替换为以下内容
<VisualStateGroup x:Name="FocusStates">
<VisualState x:Name="Focused">
<VisualState.Setters>
<Setter Target="ContentPresenter.Foreground" Value="Purple" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PointerFocused">
<VisualState.Setters>
<Setter Target="ContentPresenter.Foreground" Value="Purple" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unfocused" />
</VisualStateGroup>
Why? Because two states are happening around the same time when you click a Button
- Pressed
from CommonStates
and PointerFocused
from FocusStates
. The Focused
state is generally triggered when you tap the Tab key.
<Style x:Key="ButtonStyle" TargetType="Button">
<Setter Property="Background" Value="Transparent" />
<Setter Property="Foreground" Value="Black" />
<Setter Property="FontWeight" Value="Normal" />
<Setter Property="FontSize" Value="40" />
<Setter Property="UseSystemFocusVisuals" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid x:Name="RootGrid" Background="{TemplateBinding Background}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="PointerOver">
<VisualState.Setters>
<Setter Target="FocusContentPresenter.FontWeight" Value="Bold" />
<Setter Target="ContentPresenter.FontWeight" Value="Bold" />
<Setter Target="ContentPresenter.Foreground" Value="Pink" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Pressed">
<VisualState.Setters>
<Setter Target="ContentPresenter.Foreground" Value="Purple" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Disabled">
</VisualState>
</VisualStateGroup>
<VisualStateGroup x:Name="FocusStates">
<VisualState x:Name="Focused">
<VisualState.Setters>
<Setter Target="FocusContentPresenter.Foreground" Value="Purple" />
<Setter Target="FocusContentPresenter.(UIElement.Opacity)" Value="1" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="PointerFocused">
<VisualState.Setters>
<Setter Target="FocusContentPresenter.Foreground" Value="Purple" />
<Setter Target="FocusContentPresenter.(UIElement.Opacity)" Value="1" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unfocused" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ContentPresenter x:Name="ContentPresenter" Content="{TemplateBinding Content}" ContentTransitions="{TemplateBinding ContentTransitions}" ContentTemplate="{TemplateBinding ContentTemplate}" />
<ContentPresenter x:Name="FocusContentPresenter" Opacity="0" Content="{TemplateBinding Content}" ContentTransitions="{TemplateBinding ContentTransitions}" ContentTemplate="{TemplateBinding ContentTemplate}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>