如何在单独的视觉状态组中处理冲突的视觉状态设置器?

How to handle conflicting Visual State Setters in separate Visual State Groups?

假设我在 XAML ResourceDictionary(无代码隐藏)中定义了一个 RadioButton 样式:

<Style x:Key="ExampleRadioButtonStyle"
       TargetType="RadioButton">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="RadioButton">
                <Grid x:Name="Root">
                    <VisualStateManager.VisualStateGroups>
                        <VisualStateGroup x:Name="CommonStates">
                            <VisualState x:Name="Normal" />
                            <VisualState x:Name="PointerOver">
                                <VisualState.Setters>
                                    ???
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                        <VisualStateGroup x:Name="CheckStates">
                            <VisualState x:Name="Checked">
                                <VisualState.Setters>
                                    <Setter Target="Content.Fill" Value="White" />
                                    <Setter Target="Content.Stroke" Value="Blue" />
                                </VisualState.Setters>
                            </VisualState>
                            <VisualState x:Name="Unchecked">
                                <VisualState.Setters>
                                    <Setter Target="Content.Fill" Value="Transparent" />
                                    <Setter Target="Content.Stroke" Value="Black" />
                                </VisualState.Setters>
                            </VisualState>
                        </VisualStateGroup>
                    </VisualStateManager.VisualStateGroups>
                    <Ellipse x:Name="Content" 
                             StrokeThickness="5"/>
                </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

现在我想在 CommonStates.CurrentState 为 时更改 Content.Stroke 属性 PointerOver 指向:

实现该目标的最佳方法是什么?

请注意,这只是一个简化的例子,准备展示我的问题,实际上这个问题要复杂得多(例如,我需要处理所有 CommonStates),所以我寻找一个不错的解决方案,而不是一个简单的解决方法,只处理鼠标悬停行为。

根据你提供的代码,我们无法直接从中获取RadioButton的选中状态PointerOver.You可以按照原生样式,创建两个Ellipse,一个用于选中状态,一个用于unselected.Use 检查状态开关显示或 hideEllipse.Then 设置行程 PointerOver.For 示例:

<Ellipse x:Name="Content" Fill="{StaticResource RadioButtonOuterEllipseFill}" Height="20" StrokeThickness="{ThemeResource RadioButtonBorderThemeThickness}" Stroke="{ThemeResource RadioButtonOuterEllipseStroke}" UseLayoutRounding="False" Width="20"/>
<Ellipse x:Name="CheckedContent" Fill="{ThemeResource RadioButtonOuterEllipseCheckedFill}" Height="20" Opacity="0" StrokeThickness="{ThemeResource RadioButtonBorderThemeThickness}" Stroke="{ThemeResource RadioButtonOuterEllipseCheckedStroke}" UseLayoutRounding="False" Width="20"/>

当CheckStates.CurrentState为Checked时,可以显示CheckedContent和隐藏Content,UnChecked则相反。

<VisualStateGroup x:Name="CheckStates">
    <VisualState x:Name="Checked">
        <VisualState.Setters>
            <Setter Target="Content.Opacity" Value="0"></Setter>
            <Setter Target="CheckedContent.Opacity" Value="1"></Setter>
            <Setter Target="CheckedContent.Fill" Value="White" />
            <Setter Target="CheckedContent.Stroke" Value="Blue" />
        </VisualState.Setters>
    </VisualState>
    ......                                    
</VisualStateGroup>

然后你可以在PointerOver中为不同的状态设置描边。

<VisualState x:Name="PointerOver">
    <VisualState.Setters>​
        <Setter Target="Content.Stroke" Value="Gray"></Setter>​
        <Setter Target="CheckedContent.Stroke" Value="Cyan"></Setter>​
    </VisualState.Setters>​
</VisualState>