我在XAML中有一个堆栈面板,目前有一个包含7个文本框的列。我的表单上有一个按钮,我希望复制当前的堆栈面板,并在每次单击时将新实例放在现有堆栈面板旁边。 这可能吗?
我的尝试:
var mynewstackpanel = new StackPanel();
var entry1 = new TextBox();
var entry2 = new TextBox();
entry1.Name = "newbox1";
entry1.Text= "newboxtext1";
entry2.Name = "newbox2";
entry2.Text = "newboxtext2";
mynewstackpanel.Children.Add(entry1);
mynewstackpanel.Children.Add(entry2);
答案 0 :(得分:2)
您想要实际动态创建控件。所以WPF得到了很大的支持。
您可以使用ItemsControl并更改其ItemTemplate以使您想要生成任何控件。确切地说,这就是你想要做的事情:
在xaml中取一个ItemsControl,并将ItemsSource绑定到ViewModel中的ObservableCollection。
更改ItemsControl的ItemTemplate以使您正在讨论StackPanel。
现在在按钮点击命令中,只需继续向ObservableCollection添加数据。
这是一个如何实现它的大致想法。你必须自己编码。
P.S。如果你觉得我回答了,请标记为已回答。
答案 1 :(得分:1)
在这种情况下,您可以使用ListBox和DataTemplate。使用ItemsPanel将项目水平添加到ListBox并定义ItemsPanelTemplate。请参阅下面的代码。
<StackPanel>
<ListBox x:Name="items">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<StackPanel>
<TextBox Width="100" />
<TextBox Width="100" />
<TextBox Width="100" />
<TextBox Width="100" />
<TextBox Width="100" />
<TextBox Width="100" />
<TextBox Width="100" />
</StackPanel>
<StackPanel>
<TextBox Width="35" />
<TextBox Width="35" />
<TextBox Width="35" />
<TextBox Width="35" />
<TextBox Width="35" />
<TextBox Width="35" />
<TextBox Width="35" />
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
</ListBox>
<Button Content="Add Content" Click="Button_Click"></Button>
</StackPanel>
public partial class MainWindow : Window
{
ObservableCollection<string> lst;
public MainWindow()
{
InitializeComponent();
lst = new ObservableCollection<string>();
items.ItemsSource = lst;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
lst.Add("");
}
}