【问题标题】:WPF/C# - example for programmatically create & use Radio ButtonsWPF/C# - 以编程方式创建和使用单选按钮的示例
【发布时间】:2011-04-07 03:00:22
【问题描述】:

有人可以指出如何在 C# WPF 中以编程方式创建和使用单选按钮的示例吗?

所以基本上如何 (a) 以编程方式创建它们,以及 (b) 如何在值更改时捕获触发器,(c) 如何在给定时间获取结果。

也有兴趣看看答案是否也基于绑定方法的使用。如果数据绑定是最简单的方法,那么这方面的一个例子会很棒。否则,如果不需要数据绑定是最好/最简单的方法,那么基于非数据绑定的示例会很好。

注意事项:

  • 注意我的父节点 目前是 StackPanel,所以一个方面 问题是如何添加 多个 RadioButtons 到一个 StackPanel我猜。

  • 应该指出,我不知道编译时会有多少单选按钮,也不知道会在运行时发现什么文本。

  • 它是一个 WPF 应用程序(即桌面,而不是 Web 应用程序)

【问题讨论】:

    标签: c# .net wpf radio-button


    【解决方案1】:

    通常,我们使用 RadioButtons 向用户呈现 Enum 数据类型。而我们通常做的是使用 ItemsControl 来呈现一组 RadioButton,每个 RadioButton 都绑定到一个 ViewModel。

    下面是我刚刚编写的一个示例应用程序,它演示了如何以两种方式使用 RadioButtons:第一种是一种直接的方法(这可能会回答您上面的问题),第二种是使用 MVVM 方法。

    顺便说一句,这只是我快速写的东西(是的,我有很多时间在我手中)所以我不会说这里的一切都是完美的做事方式。但我希望这对您有所帮助:

    XAML:

    <Window x:Class="RadioButtonSample.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:RadioButtonSample"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <StackPanel x:Name="sp"/>
            <Button x:Name="showChoice" Click="showChoice_Click">Show Choice</Button>
    
            <StackPanel x:Name="sp2">
                <StackPanel.DataContext>
                    <local:ViewModel/>
                </StackPanel.DataContext>
                <ItemsControl x:Name="itemsControl" ItemsSource="{Binding Path=Choices}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <RadioButton IsChecked="{Binding Path=IsChecked}" Content="{Binding Path=Choice}" GroupName="ChoicesGroup"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            <Button x:Name="showChoice2" Click="showChoice2_Click">Show Choice2</Button>
        </StackPanel>
    </StackPanel>
    

    代码隐藏:

    using System;
    using System.Collections;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.ComponentModel;
    using System.Collections.Generic;
    
    namespace RadioButtonSample
    {
        /// <summary>
        /// Interaction logic for MainWindow.xaml
        /// </summary>
        public partial class MainWindow : Window
        {
            public MainWindow()
            {
                InitializeComponent();
    
                //Initialize the first group of radio buttons and add them to the panel.
                foreach (object obj in Enum.GetValues(typeof(ChoicesEnum)))
                {
                    RadioButton rb = new RadioButton() { Content = obj, };
                    sp.Children.Add(rb);
                    rb.Checked += new RoutedEventHandler(rb_Checked);
                    rb.Unchecked += new RoutedEventHandler(rb_Unchecked);
                }
            }
    
            void rb_Unchecked(object sender, RoutedEventArgs e)
            {
                Console.Write((sender as RadioButton).Content.ToString() + " checked.");
            }
    
            void rb_Checked(object sender, RoutedEventArgs e)
            {
                Console.Write((sender as RadioButton).Content.ToString() + " unchecked.");
            }
    
            private void showChoice_Click(object sender, RoutedEventArgs e)
            {
                foreach (RadioButton rb in sp.Children)
                {
                    if (rb.IsChecked == true)
                    {
                        MessageBox.Show(rb.Content.ToString());
                        break;
                    }
                }
            }
    
            private void showChoice2_Click(object sender, RoutedEventArgs e)
            {
                //Show selected choice in the ViewModel.
                ChoiceVM selected = (sp2.DataContext as ViewModel).SelectedChoiceVM;
                if (selected != null)
                    MessageBox.Show(selected.Choice.ToString());
            }
        }
    
        //Test Enum
        public enum ChoicesEnum
        {
            Choice1,
            Choice2,
            Choice3,
        }
    
        //ViewModel for a single Choice
        public class ChoiceVM : INotifyPropertyChanged
        {
            public ChoicesEnum Choice { get; private set; }
            public ChoiceVM(ChoicesEnum choice)
            {
                this.Choice = choice;
            }
    
            private bool isChecked;
            public bool IsChecked
            {
                get { return this.isChecked; }
                set
                {
                    this.isChecked = value;
                    this.OnPropertyChanged("IsChecked");
                }
            }
    
            #region INotifyPropertyChanged Members
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void OnPropertyChanged(string propName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
                }
            }
    
            #endregion
    
        }
    
        //Sample ViewModel containing a list of choices
        //and exposes a property showing the currently selected choice
        public class ViewModel : INotifyPropertyChanged
        {
            public List<ChoiceVM> Choices { get; private set; }
            public ViewModel()
            {
                this.Choices = new List<ChoiceVM>();
    
                //wrap each choice in a ChoiceVM and add it to the list.
                foreach (var choice in Enum.GetValues(typeof(ChoicesEnum)))
                    this.Choices.Add(new ChoiceVM((ChoicesEnum)choice));
            }
    
            public ChoiceVM SelectedChoiceVM
            {
                get
                {
                    ChoiceVM selectedChoice = this.Choices.FirstOrDefault((c) => c.IsChecked == true);
                    return selectedChoice;
                }
            }
    
            #region INotifyPropertyChanged Members
    
            public event PropertyChangedEventHandler PropertyChanged;
            private void OnPropertyChanged(string propName)
            {
                if (this.PropertyChanged != null)
                {
                    this.PropertyChanged(this, new PropertyChangedEventArgs(propName));
                }
            }
    
            #endregion
    
        }
    }
    

    【讨论】:

    • 谢谢-在我的情况下,我不知道编译时单选按钮的数量,因此我不确定枚举方法-在这种情况下该怎么做有什么建议吗?跨度>
    • 我相信它会以同样的方式工作。我认为您的 RadioButtons 组中的项目将是某种集合。因此,在上面的代码中,只需替换迭代“Enum.GetValues(...)”的循环即可使用您的集合。希望这是有道理的。
    猜你喜欢
    • 2017-06-21
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多