使单选按钮显示为按钮

时间:2019-02-06 18:27:57

标签: wpf xaml wpf-style

我有一个选项菜单,每个选项都决定应显示的内容。我基于UX和UI决定的解决方案是显示一组单选按钮,并使它们显示为按钮。当用户选择一个选项时,按钮的颜色将变为紫色,而先前选择的按钮将变为灰色,最后内容将相应更改。我正在使用WPF XAML,并将按钮的样式模板用于单选按钮。

我面临的问题是,当单击任何按钮(最初是单选按钮)时,单选按钮的IsChecked属性永远不会变为true。请帮我解决这个问题。以下是代码:

<Style x:Key="ButtonRadioButtonStyle" TargetType="{x:Type RadioButton}">

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type RadioButton}">
                    <Button Content="{TemplateBinding Content}"/>
                    <ControlTemplate.Triggers>

                        <Trigger Property="IsEnabled" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>
                        <Trigger Property="IsChecked" Value="false">
                            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
                        </Trigger>

                        <Trigger Property="IsChecked" Value="true">
                            <Setter Property="Background" Value="#FF2F2FEA" />
                        </Trigger>

                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

,然后按如下所示添加单选按钮:

<RadioButton Style="{DynamicResource ButtonRadioButtonStyle}" GroupName="modules" Height="40.64" Content="Materials" Margin="0,184.916,2,0" VerticalAlignment="Top" Checked="RadioButton_Checked" Click="RadioButton_Click"/>

当我在单选按钮的单击事件中执行以下操作时:

private void RadioButton_Click(object sender, RoutedEventArgs e)
    {
        RadioButton a = sender as RadioButton;

        MessageBox.Show(a.IsChecked.ToString());
    }

我总是显示错误。永远不会调用单选按钮的Checked事件。

1 个答案:

答案 0 :(得分:0)

我认为正在发生的事情是样式中的Button阻止了IsChecked属性的切换。但这可能会对您有所帮助:RadioButtonToggleButton的一种,而ToggleButton看起来像常规的Button。因此,您可以使用以下样式:

<Style x:Key="ButtonRadioButtonStyle" TargetType="{x:Type RadioButton}" BasedOn="{StaticResource {x:Type ToggleButton}}">
    <Style.Triggers>
        <Trigger Property="IsEnabled" Value="False">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
        </Trigger>
        <Trigger Property="IsChecked" Value="False">
            <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/>
        </Trigger>
        <Trigger Property="IsChecked" Value="True">
            <Setter Property="Background" Value="#FF2F2FEA" />
        </Trigger>
    </Style.Triggers>
</Style>

剩下的唯一问题是ToggleButton的背景颜色不会变为紫色,但这与使单选按钮看起来像一个按钮无关。问题在于按钮的样式相当复杂,需要更多的样式才能正确更改其背景(解决方案请参见Changing a WPF Button Background)。