我想使用StackPanel
对象填充RadioButton
,这些对象对应于枚举的值。每个按钮的处理程序应运行任意计算,该计算采用相应的枚举值。
这是我提出的方法:
void EnumToRadioButtonPanel(Panel panel, Type type, Action<int> proc)
{
Array.ForEach((int[])Enum.GetValues(type),
val =>
{
var button = new RadioButton() { Content = Enum.GetName(type, val) };
button.Click += (s, e) => proc(val);
panel.Children.Add(button);
});
}
例如,假设我想要RadioButton
作为枚举FigureHorizontalAnchor
。我希望每个按钮的操作都能设置名为HorizontalAnchor
的特定Figure
的{{1}}属性。以下是我调用figure
的方法:
EnumToRadioButtonPanel
我的问题是,有没有更好的方法来实现这一目标?我应该使用“绑定”技术吗?我在SO上看过几个相关的问题,但是它们涉及在XAML中列出var figure = new Figure();
var stackPanel = new StackPanel();
EnumToRadioButtonPanel(stackPanel, typeof(FigureHorizontalAnchor),
val =>
{
figure.HorizontalAnchor = (FigureHorizontalAnchor)
Enum.ToObject(typeof(FigureHorizontalAnchor), val);
});
;我想通过C#背后的代码来做到这一点。
这是上面完整的可运行演示。 XAML:
RadioButton
代码背后:
<Window x:Class="EnumToRadioButtonPanel.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">
</Window>
答案 0 :(得分:3)
如你所知,有更多的“WPF”方法可以做到。
不要通过代码创建控件。 WinForms 有点好,但是你不想在 WPF 中做到这一点。
如果要从项目列表中创建控件集合,请使用ItemsControl
:
<ItemsControl Source="{Binding ItemsIWantToCreateControlsFor}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<RadioButton
Content="{Binding APropertyDefinedInMyItem}"
Command="{Binding ACommandDefinedInMyItemThatIsExecutedWhenPressed}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
答案 1 :(得分:0)
这是EnumToRadioButtonPanel
的另一个版本,它似乎通过在类型上具有通用性而导致更清晰的代码。
void EnumToRadioButtonPanel<T>(Panel panel, Action<T> proc)
{
Array.ForEach((int[])Enum.GetValues(typeof(T)),
val =>
{
var button = new RadioButton() { Content = Enum.GetName(typeof(T), val) };
button.Click += (s, e) => proc((T)Enum.ToObject(typeof(T),val));
panel.Children.Add(button);
});
}
使用此版本,对EnumToRadioButtonPanel
的调用如下所示:
EnumToRadioButtonPanel<FigureHorizontalAnchor>(
stackPanel,
val => figure.HorizontalAnchor = val);
而不是:
EnumToRadioButtonPanel(stackPanel, typeof(FigureHorizontalAnchor),
val =>
{
figure.HorizontalAnchor = (FigureHorizontalAnchor)
Enum.ToObject(typeof(FigureHorizontalAnchor), val);
});
以下是整个示例。 XAML:
<Window x:Class="EnumToRadioButtonPanel.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">
</Window>
C#:
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
namespace EnumToRadioButtonPanel
{
public partial class MainWindow : Window
{
void EnumToRadioButtonPanel<T>(Panel panel, Action<T> proc)
{
Array.ForEach((int[])Enum.GetValues(typeof(T)),
val =>
{
var button = new RadioButton() { Content = Enum.GetName(typeof(T), val) };
button.Click += (s, e) => proc((T)Enum.ToObject(typeof(T),val));
panel.Children.Add(button);
});
}
public MainWindow()
{
InitializeComponent();
var figure = new Figure();
var stackPanel = new StackPanel();
Content = stackPanel;
EnumToRadioButtonPanel<FigureHorizontalAnchor>(
stackPanel,
val => figure.HorizontalAnchor = val);
var label = new Label();
stackPanel.Children.Add(label);
var button = new Button() { Content = "Display" };
button.Click += (s, e) => label.Content = figure.HorizontalAnchor;
stackPanel.Children.Add(button);
}
}
}