Compartir a través de


Botones de radio

Los botones de radio, también denominados botones de opción, permiten a los usuarios seleccionar una opción de una colección de dos o más opciones mutuamente excluyentes, pero relacionadas. Los botones de radio siempre se usan en grupos y cada opción se representa mediante un botón de radio del grupo.

En el estado predeterminado, no se selecciona ningún botón de radio en un grupo RadioButtons. Es decir, se borran todos los botones de radio. Sin embargo, una vez que un usuario ha seleccionado un botón de radio, el usuario no puede anular la selección del botón para restaurar el grupo a su estado inicial despejado.

El comportamiento singular de un grupo de radiobotones lo distingue de casillas, que admiten la selección múltiple y la deselección o desactivación.

ejemplo de un grupo RadioButtons, con un botón de radio seleccionado

¿Es este el control correcto?

Use botones de radio para permitir que los usuarios seleccionen entre dos o más opciones mutuamente excluyentes.

grupo RadioButtons, con un botón de radio seleccionado

Use botones de radio cuando los usuarios necesiten ver todas las opciones antes de realizar una selección. Los botones de radio resaltan todas las opciones igualmente, lo que significa que algunas opciones pueden llamar más atención de lo necesario o deseado.

A menos que todas las opciones merecen la misma atención, considere la posibilidad de usar otros controles. Por ejemplo, para recomendar una opción única para la mayoría de los usuarios y en la mayoría de las situaciones, use un cuadro combinado para mostrar esa mejor opción como opción predeterminada.

un cuadro combinado, mostrando una opción predeterminada

Si solo hay dos opciones posibles que se pueden expresar claramente como una única opción binaria, como activar/desactivar o sí/no, combínelas en una sola casilla de verificación o un control de interruptor . Por ejemplo, use una sola casilla para "Acepto" en lugar de dos botones de radio para "Acepto" y "No estoy de acuerdo".

No use dos botones de radio para una sola opción binaria:

dos botones de radio que presentan una opción binaria

Use una casilla en su lugar:

La casilla de verificación es una buena alternativa para presentar una elección binaria

Cuando los usuarios pueden seleccionar varias opciones, utilice casillas.

Las casillas admiten selección múltiple

Cuando las opciones de los usuarios se encuentran dentro de un intervalo de valores (por ejemplo, 10, 20, 30, ... 100), use un control deslizante .

un control deslizante, mostrando un valor en un intervalo de valores

Si hay más de ocho opciones, use un cuadro combinado .

un cuadro de lista, donde se muestran varias opciones

Si las opciones disponibles se basan en el contexto actual de una aplicación o pueden variar dinámicamente, use un control de lista.

Recomendaciones

  • Asegúrese de que el propósito y el estado actual de un conjunto de botones de radio sean explícitos.
  • Limite la etiqueta de texto del botón de radio a una sola línea.
  • Si la etiqueta de texto es dinámica, considere cómo cambiará automáticamente el tamaño del botón y qué ocurrirá con los objetos visuales que lo rodean.
  • Use la fuente predeterminada a menos que las directrices de marca le indiquen lo contrario.
  • No coloques dos grupos de RadioButtons en paralelo. Cuando dos grupos de RadioButtons están justo al lado de los demás, puede ser difícil que los usuarios determinen qué botones pertenecen a cada grupo.

Introducción a RadioButtons

RadioButtons frente a RadioButton

Hay dos maneras de crear grupos de botones de radio: RadioButtons y RadioButton.

  • Recomendamos el control RadioButtons. Este control simplifica el diseño, controla la navegación por teclado y la accesibilidad, y admite el enlace a un origen de datos.
  • Puede usar grupos de controles RadioButton individuales.

Acceso al teclado y el comportamiento de navegación se han optimizado en el control de RadioButtons . Estas mejoras ayudan tanto a la accesibilidad como a los usuarios avanzados del teclado a desplazarse por la lista de opciones de forma más rápida y sencilla.

Además de estas mejoras, el diseño visual predeterminado de botones de radio individuales en un grupo RadioButtons se ha optimizado a través de la orientación automatizada, el espaciado y la configuración de margen. Esta optimización elimina el requisito de especificar estas propiedades, como es posible que tenga que hacer al usar un control de agrupación más primitivo, como StackPanel o Grid.

El control RadioButtons tiene un comportamiento de navegación especial que ayuda a los usuarios del teclado a navegar por la lista de forma más rápida y sencilla.

Foco del teclado

El control RadioButtons soporta dos estados:

  • No se selecciona ningún botón de radio
  • Se selecciona un botón de radio

En las secciones siguientes se describe el comportamiento de foco del control en cada estado.

No se selecciona ningún botón de radio

Cuando no se selecciona ningún botón de radio, el primer botón de radio de la lista obtiene el foco.

Nota:

El elemento que recibe el foco al navegar inicialmente con la tecla Tab no está seleccionado.

Lista sin foco de tabulación, sin selección

Lista sin foco de tabulación y ningún elemento seleccionado

Lista con foco de tabulación inicial, sin selección

Lista con el foco puesto en la tabulación inicial y sin ningún elemento seleccionado

Se selecciona un botón de radio

Cuando un usuario ficha en la lista donde ya está seleccionado un botón de radio, el botón de radio seleccionado obtiene el foco.

Lista sin foco de tabulador

Lista sin enfoque de tabulación y con un elemento seleccionado

Lista con enfoque inicial de tabulación

Lista con el foco de tabulación inicial y un elemento seleccionado

Navegación por teclado

Para obtener más información sobre los comportamientos generales de navegación por teclado, vea Interacciones de teclado: navegación.

Cuando un elemento de un grupo de RadioButtons ya tiene el foco, el usuario puede usar las teclas de dirección para la "navegación interna" entre los elementos del grupo. Las teclas de flecha Arriba y Abajo se mueven al elemento lógico "siguiente" o "anterior", tal como se define en el marcado XAML. Las teclas de flecha izquierda y derecha se mueven espacialmente.

En un diseño de una sola columna o de una sola fila, la navegación por el teclado da como resultado el siguiente comportamiento:

de columna única

ejemplo de navegación por teclado en un grupo RadioButtons de una sola columna

Las teclas flecha arriba y Flecha abajo se mueven entre los elementos.
Las teclas de flecha izquierda y flecha derecha no hacen nada.

de fila única

Ejemplo de navegación por teclado en un grupo radioButtons de una sola fila

Las teclas de dirección Izquierda y Arriba se mueven al elemento anterior y las teclas de flecha Derecha y Abajo se mueven al siguiente elemento.

En un diseño de cuadrícula de varias columnas y varias filas, la navegación por el teclado da como resultado este comportamiento:

teclas de dirección izquierda/derecha

ejemplo de navegación por teclado horizontal en un grupo RadioButtons de varias columnas o filas

Las teclas de dirección izquierda y derecha mueven el foco horizontalmente entre los elementos de una fila.

Ejemplo de navegación por teclado horizontal con foco en el último elemento de una columna

Cuando el foco está en el último elemento de una columna y se presiona la tecla de flecha derecha o izquierda, el foco se mueve al último elemento de la columna siguiente o anterior (si existe).

teclas de flecha arriba/abajo

ejemplo de navegación por teclado vertical en un grupo RadioButtons de varias columnas o filas

Las teclas de flecha Arriba y Abajo mueven el foco verticalmente entre los elementos de una columna.

ejemplo de navegación por teclado vertical con foco en el último elemento de una columna

Cuando el foco está en el último elemento de una columna y se presiona la tecla de flecha abajo, el foco se mueve al primer elemento de la columna siguiente (si existe). Cuando el foco está en el primer elemento de una columna y se presiona la tecla de flecha arriba, el foco se mueve al último elemento de la columna anterior (si existe).

Para obtener más información, vea interacciones del teclado.

Envoltura

El grupo RadioButtons no traslada el enfoque de la primera fila o columna a la última, ni de la última fila o columna a la primera. Esto se debe a que, cuando los usuarios usan un lector de pantalla, se pierde una sensación de límite y una indicación clara de principio y fin, lo que dificulta a los usuarios con discapacidad visual navegar por la lista.

El control RadioButtons tampoco admite la enumeración, ya que el control está pensado para contener un número razonable de elementos (vea ¿Es este el control correcto?).

La selección sigue el foco

Cuando se usa el teclado para navegar entre los elementos de un grupo de RadioButtons, a medida que el foco se mueve de un elemento al siguiente, se selecciona el elemento recién centrado y se borra el elemento centrado anteriormente.

antes de la navegación mediante teclado

Ejemplo de enfoque y selección antes de la navegación con teclado

Foco y selección antes de la navegación con el teclado.

Después de la navegación del teclado

Ejemplo de foco y selección tras la navegación mediante teclado

Foco y selección después de la navegación del teclado, donde la tecla de flecha abajo mueve el foco al botón de radio 3, lo selecciona y borra el botón de radio 2.

Puede mover el foco sin cambiar la selección mediante ctrl+teclas de dirección para navegar. Después de mover el foco, puede usar la barra espaciadora para seleccionar el elemento que tiene el foco actualmente.

Si usas un panel para juegos o un control remoto para moverte entre botones de radio, el comportamiento de "selección sigue el foco" está deshabilitado y el usuario debe presionar el botón "A" para seleccionar el botón de radio que tiene el foco actualmente.

Comportamiento de accesibilidad

En la tabla siguiente se describe cómo el Narrador gestiona un grupo de RadioButtons y lo que se anuncia. Este comportamiento depende de cómo un usuario haya establecido las preferencias de detalles del Narrador.

Acción Anuncio del narrador
El foco se mueve a un elemento seleccionado "nombre, RadioButton, seleccionado, x de N"
El foco se mueve a un elemento no seleccionado
(si navega con teclas ctrl-flecha o controlador para juegos xbox,
que indica que la selección no sigue el enfoque.
"nombre, RadioButton, no seleccionado, x de N"

Nota:

El nombre que el Narrador anuncia para cada elemento es el valor de la propiedad adjunta AutomationProperties.Name si está disponible para el elemento; de lo contrario, es el valor devuelto por el método ToString del elemento.

x es el número del elemento actual. N es el número total de elementos del grupo.

Crear un grupo de RadioButtons de WinUI

La aplicación WinUI 3 Gallery incluye ejemplos interactivos de la mayoría de los controles, características y funcionalidades de WinUI 3. Obtén la aplicación desde la Microsoft Store o consigue el código fuente en GitHub

El control RadioButtons usa un modelo de contenido similar a un ItemsControl. Esto significa que puede:

  • Rellénelo agregando elementos directamente a la colección Items o enlazando los datos a su propiedad ItemsSource.
  • Use las propiedades SelectedIndex o SelectedItem para obtener y establecer qué opción está seleccionada.
  • Controla el evento SelectionChanged para tomar medidas cuando se elige una opción.

Aquí, declara un control de RadioButtons simple con tres opciones. La propiedad encabezado está establecida para asignar al grupo una etiqueta y la propiedad está establecida para proporcionar una opción predeterminada.

<RadioButtons Header="Background color"
              SelectedIndex="0"
              SelectionChanged="BackgroundColor_SelectionChanged">
    <x:String>Red</x:String>
    <x:String>Green</x:String>
    <x:String>Blue</x:String>
</RadioButtons>

El resultado tiene este aspecto:

Grupo de tres botones de radio

Para realizar una acción cuando el usuario selecciona una opción, controle el evento SelectionChanged. Aquí, cambia el color de fondo de un elemento Border llamado "ExampleBorder" ().

private void BackgroundColor_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if (ExampleBorder != null && sender is RadioButtons rb)
    {
        string colorName = rb.SelectedItem as string;
        switch (colorName)
        {
            case "Red":
                ExampleBorder.Background = new SolidColorBrush(Colors.Red);
                break;
            case "Green":
                ExampleBorder.Background = new SolidColorBrush(Colors.Green);
                break;
            case "Blue":
                ExampleBorder.Background = new SolidColorBrush(Colors.Blue);
                break;
        }
    }
}

Sugerencia

También puede obtener el elemento seleccionado de la propiedad SelectionChangedEventArgs.AddedItems. Solo habrá un elemento seleccionado, en el índice 0, por lo que podría obtener el elemento seleccionado de la siguiente manera: string colorName = e.AddedItems[0] as string;.

Estados de selección

Un botón de radio tiene dos estados: seleccionado o desactivado. Cuando seleccionas una opción en un grupo de RadioButtons, puedes obtener su valor a través de la propiedad SelectedItem y su ubicación en la colección mediante la propiedad SelectedIndex. Se puede borrar un botón de radio si un usuario selecciona otro botón de radio en el mismo grupo, pero no se puede borrar si el usuario lo selecciona de nuevo. Sin embargo, puede borrar un grupo de botones de radio mediante programación estableciendo SelectedItem = nullo SelectedIndex = -1. (Si se establece SelectedIndex en cualquier valor fuera del intervalo de la colección de Items, no se obtiene ninguna selección).

Contenido de RadioButtons

En el ejemplo anterior, ha rellenado el control RadioButtons con cadenas simples. El control proporcionó los botones de radio y usó las cadenas como etiqueta para cada uno.

Sin embargo, puede rellenar el control RadioButtons con cualquier objeto . Normalmente, desea que el objeto proporcione una representación de cadena que se pueda usar como etiqueta de texto. En algunos casos, una imagen podría ser adecuada en lugar de texto.

Aquí, los elementos SymbolIcon se usan para poblar el control.

<RadioButtons Header="Select an icon option:">
    <SymbolIcon Symbol="Back"/>
    <SymbolIcon Symbol="Attach"/>
    <SymbolIcon Symbol="HangUp"/>
    <SymbolIcon Symbol="FullScreen"/>
</RadioButtons>

Botones de radio de grupo con iconos de símbolos

También puede usar controles RadioButton individuales para rellenar los elementos de RadioButtons. Este es un caso especial que tratamos más adelante. Vea los controles de botón de radio en un grupo de botones de radio.

Una ventaja de poder usar cualquier objeto es que puede enlazar el control RadioButtons a un tipo personalizado en el modelo de datos. En la sección siguiente se muestra esto.

Vinculación de datos

El control RadioButtons admite el enlace de datos a su propiedad ItemsSource. En este ejemplo se muestra cómo puede enlazar el control a un origen de datos personalizado. La apariencia y la funcionalidad de este ejemplo son las mismas que el ejemplo de color de fondo anterior, pero aquí, los pinceles de color se almacenan en el modelo de datos en lugar de crearse en el controlador de eventos SelectionChanged.

<RadioButtons Header="Background color"
              SelectedIndex="0"
              SelectionChanged="BackgroundColor_SelectionChanged"
              ItemsSource="{x:Bind colorOptionItems}"/>
public sealed partial class MainPage : Page
{
    // Custom data item.
    public class ColorOptionDataModel
    {
        public string Label { get; set; }
        public SolidColorBrush ColorBrush { get; set; }

        public override string ToString()
        {
            return Label;
        }
    }

    List<ColorOptionDataModel> colorOptionItems;

    public MainPage1()
    {
        this.InitializeComponent();

        colorOptionItems = new List<ColorOptionDataModel>();
        colorOptionItems.Add(new ColorOptionDataModel()
            { Label = "Red", ColorBrush = new SolidColorBrush(Colors.Red) });
        colorOptionItems.Add(new ColorOptionDataModel()
            { Label = "Green", ColorBrush = new SolidColorBrush(Colors.Green) });
        colorOptionItems.Add(new ColorOptionDataModel()
            { Label = "Blue", ColorBrush = new SolidColorBrush(Colors.Blue) });
    }

    private void BackgroundColor_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        var option = e.AddedItems[0] as ColorOptionDataModel;
        ExampleBorder.Background = option?.ColorBrush;
    }
}

Controles RadioButton en un grupo RadioButtons

Puede usar controles individuales RadioButton para rellenar los elementos de RadioButtons. Puede hacerlo para obtener acceso a determinadas propiedades, como AutomationProperties.Name; o puede tener código RadioButton existente, pero quiere aprovechar el diseño y la navegación de RadioButtons.

<RadioButtons Header="Background color">
    <RadioButton Content="Red" Tag="red" AutomationProperties.Name="red"/>
    <RadioButton Content="Green" Tag="green" AutomationProperties.Name="green"/>
    <RadioButton Content="Blue" Tag="blue" AutomationProperties.Name="blue"/>
</RadioButtons>

Al usar controles RadioButton en un grupo de RadioButtons, el control RadioButtons sabe cómo presentar el RadioButton, por lo que no terminará con dos círculos de selección.

Sin embargo, hay algunos comportamientos que debe tener en cuenta. Se recomienda controlar el estado y los eventos en los controles individuales o en RadioButtons, pero no ambos, para evitar conflictos.

En esta tabla se muestran los eventos y propiedades relacionados en ambos controles.

RadioButton Botones de radio
activado, desactivado, Haga clic en SelecciónCambiada
EstáMarcado ElementoSeleccionado, ÍndiceSeleccionado

Si gestionas eventos de forma individual RadioButton, como Checked o Unchecked, y también gestionas el evento RadioButtons.SelectionChanged, ambos eventos se dispararán. El evento RadioButton se produce primero y, a continuación, se produce el evento RadioButtons.SelectionChanged, lo que podría dar lugar a conflictos.

Las propiedades IsChecked, SelectedItemy SelectedIndex permanecen sincronizadas. Un cambio en una propiedad actualiza las otras dos.

Se omite la propiedad RadioButton.GroupName. El grupo es creado por el control RadioButtons.

Definición de varias columnas

De forma predeterminada, el control RadioButtons organiza sus botones de radio verticalmente en una sola columna. Puede establecer la propiedad MaxColumns para que el control organice los botones de radio en varias columnas. (Cuando lo hace, se colocan en orden de columna principal, donde los elementos se rellenan de arriba a abajo y, a continuación, de izquierda a derecha).

<RadioButtons Header="RadioButtons in columns" MaxColumns="3">
    <x:String>Item 1</x:String>
    <x:String>Item 2</x:String>
    <x:String>Item 3</x:String>
    <x:String>Item 4</x:String>
    <x:String>Item 5</x:String>
    <x:String>Item 6</x:String>
</RadioButtons>

botones de radio en dos grupos de tres columnas

Sugerencia

Para tener elementos organizados en una sola fila horizontal, establezca MaxColumns igual al número de elementos del grupo.

Creación de su propio grupo radioButton

Importante

Se recomienda usar el control RadioButtons para agrupar elementos RadioButton.

Los botones de radio funcionan en grupos. Puede agrupar controles individuales RadioButton de dos maneras:

  • Colóquelos dentro del mismo contenedor primario.
  • Establezca la propiedad GroupName en cada botón de radio en el mismo valor.

En este ejemplo, el primer grupo de botones de radio se agrupa implícitamente al estar en el mismo panel de apilamiento. El segundo grupo se divide entre dos paneles de pila, por lo que GroupName se usa para agruparlos explícitamente en un único grupo.

<StackPanel>
    <StackPanel>
        <TextBlock Text="Background" Style="{ThemeResource BaseTextBlockStyle}"/>
        <!-- Group 1 - implicit grouping -->
        <StackPanel Orientation="Horizontal">
            <RadioButton Content="Green" Tag="green" Checked="BGRadioButton_Checked"/>
            <RadioButton Content="Yellow" Tag="yellow" Checked="BGRadioButton_Checked"/>
            <RadioButton Content="White" Tag="white" Checked="BGRadioButton_Checked"
                         IsChecked="True"/>
        </StackPanel>
    </StackPanel>

    <StackPanel>
        <TextBlock Text="BorderBrush" Style="{ThemeResource BaseTextBlockStyle}"/>
        <!-- Group 2 - grouped by GroupName -->
        <StackPanel Orientation="Horizontal">
            <StackPanel>
                <RadioButton Content="Green" Tag="green" GroupName="BorderBrush"
                             Checked="BorderRadioButton_Checked"/>
                <RadioButton Content="Yellow" Tag="yellow" GroupName="BorderBrush"
                             Checked="BorderRadioButton_Checked" IsChecked="True"/>
                <RadioButton Content="White" Tag="white"  GroupName="BorderBrush"
                             Checked="BorderRadioButton_Checked"/>
            </StackPanel>
        </StackPanel>
    </StackPanel>
    <Border x:Name="ExampleBorder"
            BorderBrush="#FFFFD700" Background="#FFFFFFFF"
            BorderThickness="10" Height="50" Margin="0,10"/>
</StackPanel>
private void BGRadioButton_Checked(object sender, RoutedEventArgs e)
{
    RadioButton rb = sender as RadioButton;

    if (rb != null && ExampleBorder != null)
    {
        string colorName = rb.Tag.ToString();
        switch (colorName)
        {
            case "yellow":
                ExampleBorder.Background = new SolidColorBrush(Colors.Yellow);
                break;
            case "green":
                ExampleBorder.Background = new SolidColorBrush(Colors.Green);
                break;
            case "white":
                ExampleBorder.Background = new SolidColorBrush(Colors.White);
                break;
        }
    }
}

private void BorderRadioButton_Checked(object sender, RoutedEventArgs e)
{
    RadioButton rb = sender as RadioButton;

    if (rb != null && ExampleBorder != null)
    {
        string colorName = rb.Tag.ToString();
        switch (colorName)
        {
            case "yellow":
                ExampleBorder.BorderBrush = new SolidColorBrush(Colors.Gold);
                break;
            case "green":
                ExampleBorder.BorderBrush = new SolidColorBrush(Colors.DarkGreen);
                break;
            case "white":
                ExampleBorder.BorderBrush = new SolidColorBrush(Colors.White);
                break;
        }
    }
}

Estos dos grupos de controles de RadioButton tienen este aspecto:

botones de radio en dos grupos

Estados del botón de radio

Un botón de radio tiene dos estados: seleccionado o desactivado. Cuando se selecciona un botón de radio, su propiedad IsChecked es true. Cuando se borra un botón de radio, su propiedad IsChecked es false. Se puede borrar un botón de radio si un usuario selecciona otro botón de radio en el mismo grupo, pero no se puede borrar si el usuario lo selecciona de nuevo. Sin embargo, puede borrar un botón de radio programáticamente estableciendo su propiedad IsChecked en false.

Visuales a considerar

El espaciado predeterminado de los controles de RadioButton individuales es diferente del espaciado proporcionado por un grupo de RadioButtons. Para aplicar el espaciado de RadioButtons a controles de RadioButton individuales, use un valor Margin de 0,0,7,3, como se muestra aquí.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="RadioButton">
            <Setter Property="Margin" Value="0,0,7,3"/>
        </Style>
    </StackPanel.Resources>
    <TextBlock Text="Background"/>
    <RadioButton Content="Item 1"/>
    <RadioButton Content="Item 2"/>
    <RadioButton Content="Item 3"/>
</StackPanel>

Las imágenes siguientes muestran el espaciado preferido de botones de radio en un grupo.

Imagen que muestra un conjunto de botones de radio, organizados verticalmente

Imagen que muestra instrucciones de espaciado para botones de radio

Nota:

Si usa un control RadioButtons de WinUI, el espaciado, los márgenes y la orientación ya están optimizados.

UWP y WinUI 2

Importante

La información y los ejemplos de este artículo están optimizados para aplicaciones que usan el SDK de Aplicaciones para Windows y WinUI 3, pero generalmente son aplicables a las aplicaciones para UWP que usan WinUI 2. Consulta la referencia de la API de UWP para obtener información y ejemplos específicos de la plataforma.

Esta sección contiene la información que necesitas para utilizar el control en una aplicación UWP o WinUI 2.

El control RadioButtons para aplicaciones para UWP se incluye como parte de WinUI 2. Para obtener más información e instrucciones sobre la instalación, consulta el artículo WinUI 2. Existen APIs para estos controles en los espacios de nombres Windows.UI.Xaml.Controls y Microsoft.UI.Xaml.Controls.

Hay dos maneras de crear grupos de botones de radio.

  • A partir de WinUI 2.3, se recomienda el control RadioButtons. Este control simplifica el diseño, controla la navegación por teclado y la accesibilidad, y admite el enlace a un origen de datos.
  • Puede usar grupos de controles RadioButton individuales. Si la aplicación no usa WinUI 2.3 o posterior, esta es la única opción.

Se recomienda usar la versión más reciente de WinUI 2 para obtener los estilos, las plantillas y las características más actuales de todos los controles.

Para usar el código de este artículo con WinUI 2, use un alias en XAML (usamos muxc) para representar las API de la biblioteca de interfaz de usuario de Windows que se incluyen en el proyecto. Consulta Introducción a WinUI 2 para obtener más información.

xmlns:muxc="using:Microsoft.UI.Xaml.Controls"

<muxc:RadioButtons />