Xamarin.Forms Radiobutton
O Xamarin.FormsRadioButton
é um tipo de botão que permite que os usuários selecionem uma opção de um conjunto. Cada opção é representada por um botão de opção e você só pode selecionar um botão de opção em um grupo. Por padrão, cada um RadioButton
exibe o texto:
No entanto, em algumas plataformas, um RadioButton
pode exibir um View
e, em todas as plataformas, a aparência de cada RadioButton
uma pode ser redefinida com um ControlTemplate
:
O RadioButton
controle define as seguintes propriedades:
Content
, do tipoobject
, que define ostring
ouView
a ser exibido peloRadioButton
.IsChecked
, do tipobool
, que define se oRadioButton
está marcado. Essa propriedade usa umaTwoWay
associação e tem um valor padrão defalse
.GroupName
, do tipostring
, que define o nome que especifica quaisRadioButton
controles são mutuamente exclusivos. Essa propriedade tem um valor padrão denull
.Value
, do tipoobject
, que define um valor exclusivo opcional associado aoRadioButton
.BorderColor
, do tipoColor
, que define a cor do traço da borda.BorderWidth
, do tipodouble
, que define a largura daRadioButton
borda.CharacterSpacing
, do tipodouble
, que define o espaçamento entre caracteres de qualquer texto exibido.CornerRadius
, do tipoint
, que define o raio de canto doRadioButton
.FontAttributes
, do tipoFontAttributes
, que determina o estilo de texto.FontFamily
, do tipostring
, que define a família de fontes.FontSize
, do tipodouble
, que define o tamanho da fonte.TextColor
, do tipoColor
, que define a cor de qualquer texto exibido.TextTransform
, do tipoTextTransform
, que define o uso de maiúsculas e minúsculas de qualquer texto exibido.
Essas propriedades são apoiadas por BindableProperty
objetos, o que significa que elas podem ser destinos de associações de dados e estilizadas.
O RadioButton
controle também define um CheckedChanged
evento que é acionado quando a IsChecked
propriedade é alterada, seja por meio de manipulação programática ou de usuário. O CheckedChangedEventArgs
objeto que acompanha o CheckedChanged
evento tem uma única propriedade chamada Value
, do tipo bool
. Quando o evento é acionado, o valor da CheckedChangedEventArgs.Value
propriedade é definido como o novo valor da IsChecked
propriedade.
RadioButton
O RadioButtonGroup
agrupamento pode ser gerenciado pela classe , que define as seguintes propriedades anexadas:
GroupName
, do tipostring
, que define o nome do grupo paraRadioButton
objetos em umLayout<View>
.SelectedValue
, do tipoobject
, que representa o valor do objeto verificadoRadioButton
em umLayout<View>
grupo. Essa propriedade anexada usa umaTwoWay
associação por padrão.
Para obter mais informações sobre a GroupName
propriedade anexada, consulte Group RadioButtons. Para obter mais informações sobre a SelectedValue
propriedade anexada, consulte Responder às alterações de estado de RadioButton.
Criar RadioButtons
A aparência de um RadioButton
é definida pelo tipo de dados atribuídos RadioButton.Content
à propriedade :
- Quando a
RadioButton.Content
propriedade for atribuída a umstring
, ela será exibida em cada plataforma, alinhada horizontalmente ao lado do círculo do botão de opção. - Quando o
RadioButton.Content
for atribuído a umView
, ele será exibido em plataformas com suporte (iOS, UWP), enquanto plataformas sem suporte serão fallback para uma representação de cadeia de caracteres doView
objeto (Android). Em ambos os casos, o conteúdo é exibido horizontalmente alinhado ao lado do círculo do botão de opção. - Quando um
ControlTemplate
é aplicado a umRadioButton
, umView
pode ser atribuído àRadioButton.Content
propriedade em todas as plataformas. Para obter mais informações, consulte Redefinir a aparência de RadioButton.
Exibir conteúdo baseado em cadeia de caracteres
Um RadioButton
exibe o texto quando a Content
propriedade é atribuída a um string
:
<StackLayout>
<Label Text="What's your favorite animal?" />
<RadioButton Content="Cat" />
<RadioButton Content="Dog" />
<RadioButton Content="Elephant" />
<RadioButton Content="Monkey"
IsChecked="true" />
</StackLayout>
Neste exemplo, RadioButton
os objetos são agrupados implicitamente dentro do mesmo contêiner pai. Esse XAML resulta na aparência mostrada nas seguintes capturas de tela:
Exibir conteúdo arbitrário
No iOS e na UWP, um RadioButton
pode exibir conteúdo arbitrário quando a Content
propriedade é atribuída a um View
:
<StackLayout>
<Label Text="What's your favorite animal?" />
<RadioButton>
<RadioButton.Content>
<Image Source="cat.png" />
</RadioButton.Content>
</RadioButton>
<RadioButton>
<RadioButton.Content>
<Image Source="dog.png" />
</RadioButton.Content>
</RadioButton>
<RadioButton>
<RadioButton.Content>
<Image Source="elephant.png" />
</RadioButton.Content>
</RadioButton>
<RadioButton>
<RadioButton.Content>
<Image Source="monkey.png" />
</RadioButton.Content>
</RadioButton>
</StackLayout>
Neste exemplo, RadioButton
os objetos são agrupados implicitamente dentro do mesmo contêiner pai. Esse XAML resulta na aparência mostrada nas seguintes capturas de tela:
exibição
No Android, RadioButton
os objetos exibirão uma representação baseada em cadeia de caracteres do View
objeto que foi definido como conteúdo:
Observação
Quando um ControlTemplate
é aplicado a um RadioButton
, um View
pode ser atribuído à RadioButton.Content
propriedade em todas as plataformas. Para obter mais informações, consulte Redefinir a aparência de RadioButton.
Associar valores a RadioButtons
Cada RadioButton
objeto tem uma Value
propriedade, do tipo object
, que define um valor exclusivo opcional a ser associado ao botão de opção. Isso permite que o valor de um RadioButton
seja diferente de seu conteúdo e é particularmente útil quando RadioButton
os objetos estão exibindo View
objetos.
O XAML a seguir mostra a configuração das Content
propriedades e Value
em cada RadioButton
objeto:
<StackLayout>
<Label Text="What's your favorite animal?" />
<RadioButton Value="Cat">
<RadioButton.Content>
<Image Source="cat.png" />
</RadioButton.Content>
</RadioButton>
<RadioButton Value="Dog">
<RadioButton.Content>
<Image Source="dog.png" />
</RadioButton.Content>
</RadioButton>
<RadioButton Value="Elephant">
<RadioButton.Content>
<Image Source="elephant.png" />
</RadioButton.Content>
</RadioButton>
<RadioButton Value="Monkey">
<RadioButton.Content>
<Image Source="monkey.png" />
</RadioButton.Content>
</RadioButton>
</StackLayout>
Neste exemplo, cada RadioButton
um tem um Image
como seu conteúdo, ao mesmo tempo em que define um valor baseado em cadeia de caracteres. Isso permite que o valor do botão de opção verificado seja facilmente identificado.
Agrupar RadioButtons
Os botões de opção funcionam em grupos e há três abordagens para agrupar botões de opção:
- Coloque-os dentro do mesmo contêiner pai. Isso é conhecido como agrupamento implícito .
- Defina a
GroupName
propriedade em cada botão de opção no grupo com o mesmo valor. Isso é conhecido como agrupamento explícito . - Defina a
RadioButtonGroup.GroupName
propriedade anexada em um contêiner pai, que, por sua vez, define aGroupName
propriedade de qualquerRadioButton
objeto no contêiner. Isso também é conhecido como agrupamento explícito .
Importante
RadioButton
os objetos não precisam pertencer ao mesmo pai para serem agrupados. Eles são mutuamente exclusivos, desde que compartilhem um nome de grupo.
Agrupamento explícito com a propriedade GroupName
O exemplo XAML a seguir mostra o agrupamento explícito de objetos definindo RadioButton
suas GroupName
propriedades:
<Label Text="What's your favorite color?" />
<RadioButton Content="Red"
GroupName="colors" />
<RadioButton Content="Green"
GroupName="colors" />
<RadioButton Content="Blue"
GroupName="colors" />
<RadioButton Content="Other"
GroupName="colors" />
Neste exemplo, cada um RadioButton
é mutuamente exclusivo porque compartilha o mesmo GroupName
valor.
Agrupamento explícito com a propriedade anexada RadioButtonGroup.GroupName
A RadioButtonGroup
classe define uma GroupName
propriedade anexada, do tipo string
, que pode ser definida em um Layout<View>
objeto . Isso permite que qualquer layout seja transformado em um grupo de botões de opção:
<StackLayout RadioButtonGroup.GroupName="colors">
<Label Text="What's your favorite color?" />
<RadioButton Content="Red" />
<RadioButton Content="Green" />
<RadioButton Content="Blue" />
<RadioButton Content="Other" />
</StackLayout>
Neste exemplo, cada RadioButton
um no StackLayout
terá sua GroupName
propriedade definida como colors
e será mutuamente exclusiva.
Observação
Quando um Layout<View
> objeto que define a RadioButtonGroup.GroupName
propriedade anexada contém um RadioButton
que define sua GroupName
propriedade, o valor da RadioButton.GroupName
propriedade terá precedência.
Responder às alterações de estado de RadioButton
Um botão de opção tem dois estados: marcado ou desmarcado. Quando um botão de opção é verificado, sua IsChecked
propriedade é true
. Quando um botão de opção é desmarcado, sua IsChecked
propriedade é false
. Um botão de opção pode ser limpo tocando em outro botão de opção no mesmo grupo, mas não pode ser limpo tocando nele novamente. No entanto, você pode desmarcar um botão de opção programaticamente, configurando a propriedade IsChecked
dele como false
.
Responder a um evento disparado
Quando a IsChecked
propriedade é alterada, por meio de manipulação programática ou de usuário, o evento é acionado CheckedChanged
. Um manipulador de eventos para esse evento pode ser registrado para responder à alteração:
<RadioButton Content="Red"
GroupName="colors"
CheckedChanged="OnColorsRadioButtonCheckedChanged" />
O code-behind contém o manipulador do CheckedChanged
evento:
void OnColorsRadioButtonCheckedChanged(object sender, CheckedChangedEventArgs e)
{
// Perform required operation
}
O sender
argumento é o RadioButton
responsável por esse evento. Você pode usar isso para acessar o RadioButton
objeto ou para distinguir entre vários RadioButton
objetos que compartilham o mesmo CheckedChanged
manipulador de eventos.
Responder a uma alteração de propriedade
A RadioButtonGroup
classe define uma SelectedValue
propriedade anexada, do tipo object
, que pode ser definida em um Layout<View>
objeto . Essa propriedade anexada representa o valor do verificado RadioButton
em um grupo definido em um layout.
Quando a IsChecked
propriedade é alterada, por meio de manipulação programática ou de usuário, a RadioButtonGroup.SelectedValue
propriedade anexada também é alterada. Portanto, a RadioButtonGroup.SelectedValue
propriedade anexada pode ser de dados associados a uma propriedade que armazena a seleção do usuário:
<StackLayout RadioButtonGroup.GroupName="{Binding GroupName}"
RadioButtonGroup.SelectedValue="{Binding Selection}">
<Label Text="What's your favorite animal?" />
<RadioButton Content="Cat"
Value="Cat" />
<RadioButton Content="Dog"
Value="Dog" />
<RadioButton Content="Elephant"
Value="Elephant" />
<RadioButton Content="Monkey"
Value="Monkey"/>
<Label x:Name="animalLabel">
<Label.FormattedText>
<FormattedString>
<Span Text="You have chosen:" />
<Span Text="{Binding Selection}" />
</FormattedString>
</Label.FormattedText>
</Label>
</StackLayout>
Neste exemplo, o valor da RadioButtonGroup.GroupName
propriedade anexada é definido pela GroupName
propriedade no contexto de associação. Da mesma forma, o valor da RadioButtonGroup.SelectedValue
propriedade anexada é definido pela Selection
propriedade no contexto de associação. Além disso, a Selection
propriedade é atualizada para a Value
propriedade do verificado RadioButton
.
Estados visuais de RadioButton
RadioButton
os objetos têm Checked
estados visuais e Unchecked
que podem ser usados para iniciar uma alteração visual quando um RadioButton
é verificado ou desmarcado.
O exemplo XAML a seguir mostra como definir um estado visual para os Checked
estados e Unchecked
:
<ContentPage ...>
<ContentPage.Resources>
<Style TargetType="RadioButton">
<Setter Property="VisualStateManager.VisualStateGroups">
<VisualStateGroupList>
<VisualStateGroup x:Name="CheckedStates">
<VisualState x:Name="Checked">
<VisualState.Setters>
<Setter Property="TextColor"
Value="Green" />
<Setter Property="Opacity"
Value="1" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unchecked">
<VisualState.Setters>
<Setter Property="TextColor"
Value="Red" />
<Setter Property="Opacity"
Value="0.5" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</Setter>
</Style>
</ContentPage.Resources>
<StackLayout>
<Label Text="What's your favorite mode of transport?" />
<RadioButton Content="Car" />
<RadioButton Content="Bike" />
<RadioButton Content="Train" />
<RadioButton Content="Walking" />
</StackLayout>
</ContentPage>
Neste exemplo, os objetos de destino RadioButton
implícitosStyle
. O Checked
VisualState
especifica que, quando um RadioButton
for verificado, sua TextColor
propriedade será definida como verde com um Opacity
valor de 1. O Unchecked
VisualState
especifica que quando um RadioButton
está em um estado desmarcado, sua TextColor
propriedade será definida como vermelha com um Opacity
valor de 0,5. Portanto, o efeito geral é que, quando um RadioButton
é desmarcado, ele é vermelho e parcialmente transparente e fica verde sem transparência quando é verificado:
Para obter mais informações sobre estados visuais, consulte Xamarin.Forms Visual State Manager.
Redefinir a aparência de RadioButton
Por padrão, RadioButton
os objetos usam renderizadores de plataforma para utilizar controles nativos em plataformas com suporte. No entanto, RadioButton
a estrutura visual pode ser redefinida com um ControlTemplate
, para que RadioButton
os objetos tenham uma aparência idêntica em todas as plataformas. Isso é possível porque a RadioButton
classe herda da TemplatedView
classe .
O XAML a seguir mostra um ControlTemplate
que pode ser usado para redefinir a estrutura visual de RadioButton
objetos:
<ContentPage ...>
<ContentPage.Resources>
<ControlTemplate x:Key="RadioButtonTemplate">
<Frame BorderColor="#F3F2F1"
BackgroundColor="#F3F2F1"
HasShadow="False"
HeightRequest="100"
WidthRequest="100"
HorizontalOptions="Start"
VerticalOptions="Start"
Padding="0">
<VisualStateManager.VisualStateGroups>
<VisualStateGroupList>
<VisualStateGroup x:Name="CheckedStates">
<VisualState x:Name="Checked">
<VisualState.Setters>
<Setter Property="BorderColor"
Value="#FF3300" />
<Setter TargetName="check"
Property="Opacity"
Value="1" />
</VisualState.Setters>
</VisualState>
<VisualState x:Name="Unchecked">
<VisualState.Setters>
<Setter Property="BackgroundColor"
Value="#F3F2F1" />
<Setter Property="BorderColor"
Value="#F3F2F1" />
<Setter TargetName="check"
Property="Opacity"
Value="0" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
</VisualStateManager.VisualStateGroups>
<Grid Margin="4"
WidthRequest="100">
<Grid WidthRequest="18"
HeightRequest="18"
HorizontalOptions="End"
VerticalOptions="Start">
<Ellipse Stroke="Blue"
Fill="White"
WidthRequest="16"
HeightRequest="16"
HorizontalOptions="Center"
VerticalOptions="Center" />
<Ellipse x:Name="check"
Fill="Blue"
WidthRequest="8"
HeightRequest="8"
HorizontalOptions="Center"
VerticalOptions="Center" />
</Grid>
<ContentPresenter />
</Grid>
</Frame>
</ControlTemplate>
<Style TargetType="RadioButton">
<Setter Property="ControlTemplate"
Value="{StaticResource RadioButtonTemplate}" />
</Style>
</ContentPage.Resources>
<!-- Page content -->
</ContentPage>
Neste exemplo, o elemento raiz do ControlTemplate
é um Frame
objeto que define Checked
e Unchecked
estados visuais. O Frame
objeto usa uma combinação de Grid
objetos , Ellipse
e ContentPresenter
para definir a estrutura visual de um RadioButton
. O exemplo também inclui um estilo implícito que atribuirá o RadioButtonTemplate
ControlTemplate
à propriedade de quaisquer RadioButton
objetos na página.
Observação
O ContentPresenter
objeto marca o local na estrutura visual em que RadioButton
o conteúdo será exibido.
O XAML a seguir mostra RadioButton
objetos que consomem o ControlTemplate
por meio do estilo implícito :
<StackLayout>
<Label Text="What's your favorite animal?" />
<StackLayout RadioButtonGroup.GroupName="animals"
Orientation="Horizontal">
<RadioButton Value="Cat">
<RadioButton.Content>
<StackLayout>
<Image Source="cat.png"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
<Label Text="Cat"
HorizontalOptions="Center"
VerticalOptions="End" />
</StackLayout>
</RadioButton.Content>
</RadioButton>
<RadioButton Value="Dog">
<RadioButton.Content>
<StackLayout>
<Image Source="dog.png"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
<Label Text="Dog"
HorizontalOptions="Center"
VerticalOptions="End" />
</StackLayout>
</RadioButton.Content>
</RadioButton>
<RadioButton Value="Elephant">
<RadioButton.Content>
<StackLayout>
<Image Source="elephant.png"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
<Label Text="Elephant"
HorizontalOptions="Center"
VerticalOptions="End" />
</StackLayout>
</RadioButton.Content>
</RadioButton>
<RadioButton Value="Monkey">
<RadioButton.Content>
<StackLayout>
<Image Source="monkey.png"
HorizontalOptions="Center"
VerticalOptions="CenterAndExpand" />
<Label Text="Monkey"
HorizontalOptions="Center"
VerticalOptions="End" />
</StackLayout>
</RadioButton.Content>
</RadioButton>
</StackLayout>
</StackLayout>
Neste exemplo, a estrutura visual definida para cada RadioButton
é substituída pela estrutura visual definida no ControlTemplate
e, portanto, em runtime, os objetos no ControlTemplate
tornam-se parte da árvore visual para cada RadioButton
. Além disso, o conteúdo de cada RadioButton
um é substituído no ContentPresenter
definido no modelo de controle. Isso resulta na seguinte RadioButton
aparência:
com modelo
Para obter mais informações sobre modelos de controle, consulte Xamarin.Forms modelos de controle.
Desabilitar um RadioButton
Às vezes, um aplicativo entra em um estado em que um RadioButton
que está sendo verificado não é uma operação válida. Nesses casos, o RadioButton
pode ser desabilitado definindo sua IsEnabled
propriedade false
como .