0

我正在使用一个自定义控件RadioButton,该控件允许用户根据所选的RadioButton.

但是,在我的应用程序中,有时 5RadioButtons被禁用,然后重新启用。发生这种情况时VisualState,已选中 RadioButton的不会激活。相反,所有 5 个都RadioButtons显示为正常状态。

为什么会这样?我该如何解决这个问题?

这是RadioButtons我正在使用的示例。

单选按钮 VisualStates

如果我从选择第一组 5 开始RadioButtons,然后进行选择,那么一切都可能如上图所示。

但是,如果我选择第二组 5 RadioButtons,我的控件被设计为第一组将禁用。这工作正常,第二组正确启用。之后,如果我再次选择第一组,每个组Radiobutton都会出现Normal VisualState。这是一个问题,因为我的程序知道#1在幕后仍然是CheckedChecked VisualState没有被触发,所以它看起来像这样:

RadioButton VisualStates(错误)

这里的目标是Checked VisualState将恢复,因为它出现在第一张图像中。

这是相应的 XAML 代码VisualStates

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="CommonStates">
        <VisualState Name="Normal"/>
        <VisualState Name="Disabled">
            <Storyboard>
                <ColorAnimation Storyboard.TargetName="FillBrush" Storyboard.TargetProperty="Color" To="#FFEEEEEE" Duration="0"/>
                <ColorAnimation Storyboard.TargetName="StrokeBrush" Storyboard.TargetProperty="Color" To="#FF777777" Duration="0"/>
                <DoubleAnimation Storyboard.TargetName="MoodEllipse" Storyboard.TargetProperty="StrokeThickness" To="1" Duration="0"/>
                <ColorAnimation Storyboard.TargetName="Presenter" Storyboard.TargetProperty="(TextBlock.Foreground).Color" To="#FF777777" Duration="0"/>
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
    <VisualStateGroup x:Name="CheckStates">
        <VisualState Name="Checked">
            <Storyboard>
                <ParallelTimeline>
                    <ColorAnimation Storyboard.TargetName="FillBrush" Storyboard.TargetProperty="Color" To="#FFC5F5FF" Duration="0:0:0.05"/>
                    <ColorAnimation Storyboard.TargetName="StrokeBrush" Storyboard.TargetProperty="Color" To="#FF12394F" Duration="0:0:0.05"/>
                    <DoubleAnimation Storyboard.TargetName="MoodEllipse" Storyboard.TargetProperty="StrokeThickness" To="2" Duration="0:0:0.05"/>
                </ParallelTimeline>
            </Storyboard>
        </VisualState>
        <VisualState Name="Unchecked"/>
        <VisualState Name="Indeterminate"/>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

这个 XAML 代码似乎是按照如何使用VisualStates的,但我想它一定有问题。

我参考了这些页面:

作为一些附加说明,我注意到如果单击其中一个Unchecked可以触发Checked 。此时,一切正常——直到禁用并重新启用该组。VisualState RadioButtonsRadioButtons

此外,当我没有在上面的 XAML 代码中包含空的Unchecked时,我遇到了Checked 甚至更奇怪的行为。VisualState VisualState

任何关于为什么VisualStates行为奇怪的见解将不胜感激。非常感谢!

编辑:

我不确定这是否重要,但组 ofRadioButtons被禁用,因为它们StackPanelsIsEnabled属性绑定到 outsideRadioButtonIsChecked属性:

<StackPanel IsEnabled="{Binding RelativeSource={RelativeSource AncestorType={x:Type RadioButton}}, Path=IsChecked}">
4

1 回答 1

1

显然,问题是我在两个不同的 中使用相同的目标属性VisualStateGroups但我不确定为什么会导致问题

为了获得所需的效果,即在重新启用后显示CheckedEllipse行为,我创建了另一个覆盖原始Ellipse.

原件Ellipse是完全不透明的,它的填充/描边属性仅由CheckStates组修改。

Ellipse的最初是完全透明的 ( Opacity="0"),但禁用状态会导致不透明度更改为完全不透明。

这个新的Ellipse淡入视野并掩盖了原来的Ellipse,它显示了Checked/Unchecked状态的外观。这会导致 的整体结果RadioButton显示为Disabled

这解决了 OP 中描述的问题,但它引入了一个新问题:从Disabled状态到Checked状态的转换是立即的。这可以通过将其包含VisualTransitionCommonStates组中来解决:

<VisualTransition From="Disabled" To="Checked" GeneratedDuration="0:0:0.25"/>

这是用于解决问题的最终 XAML:

<VisualStateManager.VisualStateGroups>
    <VisualStateGroup x:Name="CommonStates">
        <VisualStateGroup.Transitions>
            <VisualTransition From="Disabled" To="Checked" GeneratedDuration="0:0:0.25"/>
        </VisualStateGroup.Transitions>
        <VisualState Name="Normal"/>
        <VisualState Name="Disabled">
            <Storyboard>
                <DoubleAnimation Storyboard.TargetName="EllipseOverlay" Storyboard.TargetProperty="Opacity" To="1" Duration="0:0:0.15"/>
            </Storyboard>
        </VisualState>
    </VisualStateGroup>
    <VisualStateGroup x:Name="CheckStates">
        <VisualState Name="Checked">
            <Storyboard>
                <ParallelTimeline>
                    <ColorAnimation Storyboard.TargetName="FillBrush" Storyboard.TargetProperty="Color" To="#FFC5F5FF" Duration="0:0:0.05"/>
                    <ColorAnimation Storyboard.TargetName="StrokeBrush" Storyboard.TargetProperty="Color" To="#FF12394F" Duration="0:0:0.05"/>
                    <DoubleAnimation Storyboard.TargetName="MoodEllipse" Storyboard.TargetProperty="StrokeThickness" To="2" Duration="0:0:0.05"/>
                </ParallelTimeline>
            </Storyboard>
        </VisualState>
        <VisualState Name="Unchecked"/>
        <VisualState Name="Indeterminate"/>
    </VisualStateGroup>
</VisualStateManager.VisualStateGroups>

在我的控制下,我将它Ellipse显示在我原来的 之后Ellipse,当不透明度增加时,导致新的出现在顶部。下面是新的Ellipse

<Ellipse x:Name="EllipseOverlay" StrokeThickness="1" Opacity="0" Fill="#FFEEEEEE" Stroke="#FF777777"/>

请注意,这Ellipse包含使用 OP 的Disabled的Fill/Stroke属性。 VisualState

于 2014-09-12T15:53:49.110 回答