【问题标题】:Dynamically Generate Set of RadioButtons With Different Content in WPF在 WPF 中动态生成具有不同内容的单选按钮集
【发布时间】:2012-10-13 00:44:17
【问题描述】:

我是一名 C++ 开发人员,最近转向 C#。我正在开发一个 WPF 应用程序,我需要在其中动态生成 4 个单选按钮。我尝试了很多 RnD,但看起来这种情况很少见。

XAML:

<RadioButton Content="Base 0x" Height="16" Name="radioButton1" Width="80" />

现在是这样的场景:我应该使用不同的Content 生成这个单选按钮 4 次,如下所示:

<RadioButton Content = Base 0x0 />
<RadioButton Content = Base 0x40 />
<RadioButton Content = Base 0x80 />
<RadioButton Content = Base 0xc0 />

我在我的 C++ 应用程序中按如下方式完成了此操作:

#define MAX_FPGA_REGISTERS 0x40;

for(i = 0; i < 4; i++)
{
    m_registerBase[i] = new ToggleButton(String(T("Base 0x")) + String::toHexString(i * MAX_FPGA_REGISTERS));       
    addAndMakeVisible(m_registerBase[i]);
    m_registerBase[i]->addButtonListener(this);
}
m_registerBase[0]->setToggleState(true); 

如果您在上面注意到,每次 for 循环运行内容名称变为 Base 0x0Base 0x40base 0x80base 0xc0,并将第一个单选按钮的切换状态设置为 true。因此,如果您注意到所有这 4 个按钮都会有一个按钮单击方法,并且每个按钮都会根据索引执行操作。

如何在我的 WPF 应用程序中实现这一点? :)

【问题讨论】:

    标签: c# wpf dynamic radio-button


    【解决方案1】:

    我打算为您编写一组代码,但意识到您的问题可能已经在这里得到解答: WPF/C# - example for programmatically create & use Radio Buttons

    这可能是最干净的方式,当然取决于您的要求。如果你想要最简单的情况,这里是:

    Xaml:

    <Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
        <Grid >
            <StackPanel x:Name="MyStackPanel" />
    
        </Grid>
    </Window>
    

    C#:

        public MainWindow()
        {
            InitializeComponent();
    
            for (int i = 0; i < 4; i++)
            {
                RadioButton rb = new RadioButton() { Content = "Radio button " + i, IsChecked = i == 0  };
                rb.Checked += (sender, args) => 
                {
                    Console.WriteLine("Pressed " + ( sender as RadioButton ).Tag );
                };
                rb.Unchecked += (sender, args) => { /* Do stuff */ };
                rb.Tag = i;
    
                MyStackPanel.Children.Add( rb );
            }
        }
    

    只需为内容、标签等添加您需要的任何逻辑。

    【讨论】:

    • 非常感谢好友 :) MVVM 是我想采用的方法。但我可以看到他有一个 2 按钮单击事件。这是我的 MVVM 方法所必需的吗?
    • 不,这不是必需的。我还想指出,事件处理程序是以“非 MVVM”方式添加的,因为它们是在窗口的代码隐藏中设置的,而不是通过 XAML 和视图模型设置的。相反,您要做的是使用样式在单选按钮的 IsChecked 属性上设置绑定。在任何情况下,您都可以订阅或忽略您想要的任何事件。
    • 这看起来不错。我尝试实现 MVVM 方法,看起来不错。你的方法也简单得多:)
    • 理想情况下,我希望有一个索引,它可以为我提供我选择的任何单选按钮。由于 buttonclick 方法对所有人都是相同的,因此 ID 将帮助我执行所选单选按钮的逻辑。我怎样才能以 MVVM 方式做到这一点? :)
    • 看看这个:stackoverflow.com/questions/2284752/… 如果你想纯粹用 MVVM 来做,第一个答案应该对你有帮助。否则,请尝试我对上面初始化代码的编辑。
    猜你喜欢
    • 2012-10-18
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2013-08-13
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多