WPF / C# - 例如用于编程的方式创建和放大器;使用单选按钮放大器、单选、按钮、方式

2023-09-06 13:13:34 作者:妞,给爷笑个。

可有人点到如何以编程方式创建和放大器的一个例子;使用单选按钮在C#WPF?

Can someone point to an example of how to programmatically create & use Radio Buttons in C# WPF?

所以基本上如何(一)创建它们编程,和(b)如何捕捉触发时的数值变化;(三)如何拿起在给定时间的结果。

So basically how to (a) create them programmatically, and (b) how to catch triggers when the value changes, (c) how to pick up results at a given time.

会有兴趣看得太如果答案将根据使用的绑定方法了。如果数据绑定是去那么这样的一个例子将是巨大的最简单的方法。否则,如果数据绑定是没有必要去然后一个非数据结合基的例子是良好的最佳/最简单的方法。

Will be interested to see too if the answer will be based on use of a Binding approach too. If data binding is the easiest way to go then an example of this would be great. Else if data binding isn't necessary the best/easiest way to go then a non-data-binding based example would be good.

注:

注意,父节点我有 目前是StackPanel中,这样的一个方面 问题是如何增加 多个单选按钮到 StackPanelI猜测。

Note that the parent node I have currently is StackPanel, so an aspect of the question is how to add multiple RadioButtons to a StackPanelI guess.

应该指出的是,我不知道有多少单选按钮会出现在编译的时候,也没有文字会是什么,这将发现在运行时。

Should point out that I won't know how many radio buttons there will be at compile time, nor what the text will be this will be discovered at run time.

这是一个WPF应用程序(即台式机,而不是一个Web应用程序)

It is a WPF application (i.e. desktop, not a web app)

推荐答案

通常情况下,我们使用单选按钮,以present枚举数据类型的用户。而我们通常做的是使用一个ItemsControl到present一组单选按钮,用每一个绑定到视图模型。

Normally, we use RadioButtons to present an Enum data type to the user. And what we usually do is use an ItemsControl to present a group of RadioButtons, with each one bound to a ViewModel.

下面是一个示例应用程序,我只是写了演示如何单选按钮可以有两种使用方式:第一种是有点直接的办法(这可能会回答上面的问题),而第二个使用了MVVM的做法。

Below is a sample application I just wrote that demonstrates how RadioButtons could be used in two ways: the first is somewhat of a direct approach (and this may answer your questions above), and the second one uses an MVVM approach.

顺便说一句,这只是我写的很快(是的,我在我的手里得到了很多的时间),所以我不会说,一切都在这里做事的最佳方式。但我希望对您有所帮助:

BTW, this is just something I wrote quickly (yeah, I got a lot of time in my hands) so I won't say that everything in here is the perfect way of doing things. But I hope you find this helpful:

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>

code-背后:

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

    }
}
 
精彩推荐