Search code examples
c#radio-buttonwinui-3togglebutton

How to get a group of toggle buttons to act like radio buttons in WinUI3?


How to get a group of toggle buttons to act like radio buttons in WinUI3?

For the example below, how to implement following UI behavior:

  1. You can make the one of four toggle buttons checked by clicking it, and at same time uncheck the other 3 buttons.

  2. You cannot uncheck a checked toggle button by clicking it.

enter image description here

<StackPanel Orientation="Horizontal" VerticalAlignment="Top">
    <ToggleButton x:Name="Toggle1" Content="ToggleButton"
        IsEnabled="{x:Bind DisableToggle1.IsChecked.Value.Equals(x:False), Mode=OneWay}"
        Checked="ToggleButton_Checked" Unchecked="ToggleButton_Unchecked" />
</StackPanel>

Solution

  • Instead of setting IsEnabled, I'd set IsHitTestVisible like this:

    <StackPanel x:Name="ToggeButtons">
        <ToggleButton
            Checked="ToggleButton_Checked"
            Content="1" />
        <ToggleButton
            Checked="ToggleButton_Checked"
            Content="2" />
        <ToggleButton
            Checked="ToggleButton_Checked"
            Content="3" />
        <ToggleButton
            Checked="ToggleButton_Checked"
            Content="4" />
    </StackPanel>
    
    private void ToggleButton_Checked(object sender, RoutedEventArgs e)
    {
        if (sender is not ToggleButton checkedToggleButton)
        {
            return;
        }
    
        foreach (ToggleButton toggleButton in ToggeButtons.Children.OfType<ToggleButton>())
        {
            toggleButton.IsChecked = toggleButton == checkedToggleButton;
            toggleButton.IsHitTestVisible = toggleButton != checkedToggleButton;
        }
    }