Сделать радио кнопку в виде кнопок - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть меню опций, и каждая опция решает, какой контент должен отображаться.Решение, которое я решил, основанное на UX и UI, - показать группу переключателей и заставить их отображаться в виде кнопок.Цвет кнопки становится фиолетовым, когда пользователь выбирает параметр, а ранее выбранная кнопка становится серым, и, наконец, содержимое изменяется соответствующим образом.Я использую WPF XAML и использую шаблон стиля кнопки для переключателя.

Проблема, с которой я сталкиваюсь, состоит в том, что свойство IsChecked переключателя никогда не становится истинным, когда нажимается любая кнопка (которая изначально была переключателем).Пожалуйста, помогите мне решить эту проблему.Ниже приведен код:

<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 голосов
/ 08 февраля 2019

Я думаю, что происходит в том, что 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 не меняется на фиолетовый, но это не связано с тем, чтобы переключатель выглядел каккнопка.Проблема в том, что стиль кнопки довольно сложный, и для правильного изменения фона требуется больше стиля (см. Изменение фона кнопки WPF для решения).

...