我有一个选项菜单,每个选项都决定应显示的内容。我基于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事件。
答案 0 :(得分:0)
我认为正在发生的事情是样式中的Button
阻止了IsChecked
属性的切换。但这可能会对您有所帮助:RadioButton
是ToggleButton
的一种,而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)。