如何在运行时复制并在buttonpress上放置新的stackpanel?

时间:2015-04-30 15:42:31

标签: c# wpf xaml

我在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);

2 个答案:

答案 0 :(得分:2)

您想要实际动态创建控件。所以WPF得到了很大的支持。

您可以使用ItemsControl并更改其ItemTemplate以使您想要生成任何控件。确切地说,这就是你想要做的事情:

  1. 在xaml中取一个ItemsControl,并将ItemsSource绑定到ViewModel中的ObservableCollection。

  2. 更改ItemsControl的ItemTemplate以使您正在讨论StackPanel。

  3. 现在在按钮点击命令中,只需继续向ObservableCollection添加数据。

  4. 这是一个如何实现它的大致想法。你必须自己编码。

    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("");
    }
}