【问题标题】:how to use radio buttons in xamarin forms如何在 xamarin 表单中使用单选按钮
【发布时间】:2021-01-20 02:01:37
【问题描述】:

创建一个注册页面,我需要从用户那里获取以下数据。

  • 名字
  • 姓氏
  • 用户名
  • 电子邮件
  • 密码
  • 出生日期
  • 性别
  • 用户角色

对于最后两个参数,我无法找到如何在 Xamarin.Forms 中使用单选按钮。以下是我的注册页面代码。

<StackLayout BackgroundColor="#30af91" Padding="60">


<Entry Text="{Binding FirstName}" Placeholder="First Name"/>
<Entry Text="{Binding LastName}" Placeholder="Last Name"/>
<Entry Text="{Binding UserName}" Placeholder="Last Name"/>
<Entry Text="{Binding Email}" Placeholder="Email" />
<Entry Text="{Binding Password}" Placeholder="Password" IsPassword="True"/>
<Entry Text="{Binding ConfirmPassword}" Placeholder="Confirm Password" IsPassword="True"/>
<DatePicker MinimumDate="1/1/1948" MaximumDate="12/31/2007"/>


<!--Radio buttons for Gender
    1. Male   2.Female-->

<!--Radio Buttons for UserRole
    1. Admin  2.Participant-->

<Button Command="{Binding RegisterCommand}" Text="Register"/>
<Label Text="{Binding Message}" />


</StackLayout>

【问题讨论】:

    标签: xamarin xamarin.forms


    【解决方案1】:

    Xamarin 表单不提供单选按钮。

    你可以使用

    1)Switch

    2)Picker

    或满足您要求的任何其他组件

    更新

    xamarin forms更新4.6版本引入了Radio按钮控件,这里是官方documentation

    【讨论】:

    【解决方案2】:

    我认为有一个更简单的解决方案,它相当简单且不需要库。真正的广播组只是一个花哨的 ListView。您只需要为每个具有 IsSelected 标志的单选按钮创建一个 viewModel 并在 2 个图像之间切换。我需要允许用户选择令牌的持续时间:

    XAML

    <ListView
        HasUnevenRows="True"
        HorizontalOptions="FillAndExpand"
        ItemsSource="{Binding Durations}"
        ItemSelected="ListView_ItemSelected"
        SelectedItem="{Binding SelectedDuration}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout
                        Orientation="Horizontal">
                        <Image
                            HeightRequest="18"
                            IsVisible="{Binding IsSelected}"
                            Source="radioButtonChecked.png"
                            WidthRequest="18"/>
                        <Image
                            HeightRequest="18"
                            IsVisible="{Binding IsUnselected}"
                            Source="radioButtonUnchecked.png"
                            WidthRequest="18"/>
                        <Label
                            Margin="8,0,0,0"
                            Text="{Binding Caption}"/>
                    </StackLayout>
                </ViewCell>
             </DataTemplate>
          </ListView.ItemTemplate>
       </ListView>
    

    我们在内容页面中创建一个列表视图并监听 ItemSelected 事件。每个列表项都是一个水平堆栈面板,我们根据所选状态在两个图像之间翻转

    代码背后

    public partial class LoginPage : ContentPage
    {
        LoginPageViewModel LoginPageViewModel { get; }
    
        public LoginTwoFactorFrequencyPage ()
        {
            BindingContext = LoginPageViewModel = new LoginPageViewModel();
    
            InitializeComponent ();
        }
    
        private void ListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
        {
            LoginPageViewModel.UpdateSelected(e.SelectedItem as PersistenceDuration);
        }
    }
    
    • 页面背后的代码实例化一个视图模型,并使用页面视图模型上新选择的项目调用 UpdateSelected 方法*

    单选按钮视图模型

    每个单选按钮的视图模型:

    public class PersistenceDuration : ViewModelBase
    {
        bool isSelected;
    
        public string Caption { get; set; }
        public TwoFactorTokenPersistenceDuration Duration { get; set; }
        public bool IsSelected
        {
            get => isSelected;
            set
            {
                isSelected = value;
                OnPropertyChanged();
                OnPropertyChanged("IsUnselected");
            }
        }
        public bool IsUnselected => !IsSelected;
    
        public PersistenceDuration(string caption, TwoFactorTokenPersistenceDuration duration)
        {
            Caption = caption;
            Duration = duration;
            IsSelected = false;
        }
    }
    

    单选按钮视图模型包含选择信息和标题。我们确保在所选状态发生变化时触发 OnPropertyChanged

    页面视图模型

    public class LoginPageViewModel : ViewModelBase
    {
        PersistenceDuration duration;
        PersistenceDuration selectedDuration;
    
        public ObservableCollection<PersistenceDuration> Durations { get; }
        public PersistenceDuration SelectedDuration
        {
            get => selectedDuration;
            set
            {
                if (value != null)
                {
                    duration = value;
                    UpdateSelected(duration);
                }
                OnPropertyChanged();
            }
        }
    
        public LoginTwoFactorFrequencyViewModel()
        {
            Durations = new ObservableCollection<PersistenceDuration>(
                new List<PersistenceDuration>()
                {
                    new PersistenceDuration(AppResources.Save_code__forever, TwoFactorTokenPersistenceDuration.Forever),
                    new PersistenceDuration(AppResources.ChatRequireEvery30Days, TwoFactorTokenPersistenceDuration.ThirtyDays),
                    new PersistenceDuration(AppResources.ChatRequireEveryLogin, TwoFactorTokenPersistenceDuration.None),
                });
        }
    
        public void UpdateSelected(PersistenceDuration persistenceDuration)
        {
            foreach (var item in Durations)
                item.IsSelected = persistenceDuration == item;
        }
    }
    

    在页面视图模型中,我们创建 XAML 绑定到的单选按钮视图模型列表。当我们 UpdateSelected() 时,所有 IsSelected 状态都会更新,这会触发绑定更新,从而翻转图像。

    当有人选择一个项目时,你仍然需要对突出显示做一些事情,但这很容易在互联网上找到:)

    【讨论】:

    • 我编辑了这个以使用第二个变量来保存引用并且从不设置实际选定的项目。这允许您避免 ListView 项目被选中并将系统颜色添加到背景。但是,您仍然会悬停并单击突出显示。没有简单的方法来设置列表项选择的颜色跨平台(希望 xamarin 家伙很快解决这个问题)
    【解决方案3】:

    您可以使用管理 NuGets 包中的 XLabs 插件。安装后可以这样使用:

    在 Xaml 中:

    controls:BindableRadioGroup x:Name="Radiobtn"
    

    在 C# 中:

    string[] gender = {"MAlE","FEMALE"}
    Radiobtn.Add(gender)
    

    参考链接
    https://github.com/XLabs/Xamarin-Forms-Labs/tree/master/samples/XLabs.Samples/XLabs.Samples/Pages/Controls

    【讨论】:

    • 注意:不再维护 XLabs。甚至不会在最新的 Xamarin Forms、IIRC 中构建。尽管如此,它仍然是有用的代码集合,可向您展示使用 Xamarin 表单的技术。不要使用 NuGet 包,而是从上面的 github 链接下载。提取您感兴趣的部分代码。修改以在当前版本的 Xamarin Forms 中工作。
    • 仅供参考,我只是看看 XLabs 为单选按钮做了什么。这一切都是通过自定义渲染器完成的。仍在寻找一个很好的例子来展示在不使用自定义渲染器的情况下可以在 X-Forms 中完成什么。在确定有必要这样做之后,只想使用自定义渲染器。到目前为止,我不认为单选按钮复杂到需要自定义渲染。 (X-Labs 是几年前完成的,当时 X-Forms 受到更多限制。)
    【解决方案4】:

    你可以在没有包的情况下获得单选按钮效果。使用带有文本 unicode 圆圈 \u26AA\u25CB 的标签。为每个标签附加一个标签手势识别器。

    点击时,将所选按钮的文本更改为 unicode circle bullet \u29BF,并将其他按钮的文本更改回 unicode circle \u26AA

    在您喜欢的平台上进行测试,因为每个平台的显示可能会有所不同。您可能需要在更改文本时调整字体大小。

    【讨论】:

      【解决方案5】:

      如果你想要真正的单选按钮,你可以 xlabs 他们的包 (https://github.com/XLabs/Xamarin-Forms-Labs/tree/master/src/Forms/XLabs.Forms/Controls/RadioButton)

      我个人只是使​​用选择器,Xlabs 包已经有一段时间没有更新了,所以它们可能是单选按钮中的一些错误

      【讨论】:

        【解决方案6】:

        您可以将图像用作单选按钮。当你点击它时,它可以改变。不过,这不是一个好方法。 这是xml代码:

        <Image  Scale="0.7"  HorizontalOptions="Start" x:Name="radioButton" Source="unRadioBtn.png">
                            <Image.GestureRecognizers>
                                <TapGestureRecognizer Tapped="radioButton_Clicked"></TapGestureRecognizer>
                            </Image.GestureRecognizers>
                        </Image>
        

        这是.cs:

         private void radioButton_Clicked(object sender, EventArgs e)
            {
                radioButton.Source = "radioBtn.png";
            }
        

        【讨论】:

          【解决方案7】:

          Xamarin.Forms 4.6 引入了新的 RadioButton 控件。你可以在这里找到文档:https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/radiobutton

          【讨论】:

            【解决方案8】:

            您可以使用switch component。您还可以从 XLabs project 中查看复选框组件的实现,该组件现已停产,获取代码并根据需要进行修改。

            提示:您需要每个平台的自定义渲染器才能正常工作。

            【讨论】:

              【解决方案9】:

              您需要使用Picker https://developer.xamarin.com/api/type/Xamarin.Forms.Picker/ 实际上它是RadionButton On Xamarin.forms

              的最佳替代品

              【讨论】:

              • 不幸的是,选择器的重新样式控制非常有限。必须为每个平台编写自定义渲染器,才能用它做任何有趣的事情。
              【解决方案10】:

              XLabs RadioButton 和 BindableRadioGroup 运行良好:XLabs RadioButton for Xamarin Forms

              这是一个使用 BindableRadioGroup 的简单 Yes/No 广播:

              var answers = new List<string>();
              answers.Add("Yes");
              answers.Add("No");
              
              var RadioGroup = new XLabs.Forms.Controls.BindableRadioGroup()
              {
                ItemsSource = answers, 
                Orientation = StackOrientation.Horizontal
              };
              

              【讨论】:

                【解决方案11】:

                Xamarin Forms 现在提供单选按钮控件。

                在此处查看文档:

                https://docs.microsoft.com/en-us/xamarin/xamarin-forms/user-interface/radiobutton

                截至 XF 4.8,这仍处于试验阶段,我尚未使用此功能,因此无法评论其稳定性。

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-09-23
                  • 2015-08-18
                  • 1970-01-01
                  • 2012-02-23
                  相关资源
                  最近更新 更多