Я пытался сделать то же самое, и я нашел этот старый пост. Позвольте мне немного обновить его ...
Тодд, похоже, похож на многих других ленивых программистов, позволяющих UX-парням делать всю работу. :) Итак, вот решение Тодда с фактическими переключателями в качестве переключателей в группе:
<RadioButton GroupName="myGroup"
Style="{StaticResource MenuButton}"
Content="One"
IsChecked="True" />
<RadioButton GroupName="myGroup"
Style="{StaticResource MenuButton}"
Content="Two" />
<RadioButton GroupName="myGroup"
Style="{StaticResource MenuButton}"
Content="Three" />
<Style x:Key="MenuButton" TargetType="RadioButton">
<Setter Property="Width" Value="100"/>
<Setter Property="Height" Value="25"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="RadioButton">
<Border BorderBrush="DarkGray" BorderThickness="3" CornerRadius="3" Background="Gray">
<ToggleButton IsChecked="{Binding IsChecked, RelativeSource={RelativeSource TemplatedParent}, Mode=TwoWay}">
<ToggleButton.Content>
<ContentPresenter></ContentPresenter>
</ToggleButton.Content>
</ToggleButton>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
И теперь у вас будут свои симпатичные эффекты переключения кнопок, и все это, и только одна кнопка переключения будет «проверена» одновременно.
И радиокнопки, и кнопки-переключатели могут иметь три состояния, и вы также можете связать свойство IsThreeState кнопки-переключателя так же, как я привязываю здесь IsChecked. Но по умолчанию это два состояния.
Кроме того, здесь важна привязка длинных форм, поскольку ярлык {TemplateBinding IsChecked} будет по умолчанию настроен на один путь, и нам нужно, чтобы они оставались синхронизированными в обоих направлениях.
Этот пример, конечно, не анимирует кнопки с изменяющимся размером и все, что Тодд первоначально опубликовал, но он дает вам обычные кнопки, которые вы можете легко отличить как проверенные или нет.