WPF - 复制stackpanel

时间:2013-11-26 08:15:34

标签: c# wpf xaml dynamic

我有这个(粗略的):

<StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label .../>
        <TextBox .../>
        <Button Content="Add new input row" ... />
    </StackPanel>
</StackPanel>

非常自我解释,我想在按钮上每次点击都添加一个新的Horizo​​ntal StackPanel。

可能吗?

谢谢你!

2 个答案:

答案 0 :(得分:0)

是的,可以尝试像这样处理事件,例如:

    // Create your StackPanel.
    StackPanel sp = new StackPanel();
    sp.Orientation = Orientation.Horizontal;
    // Add controls to new StackPanel
    // Control con = new Control();
    // sp.Children.Add(con);

    // Add created control to a previously created (and named) container.
    myStackPanel.Children.Add(sp);

如果您希望StackPanel包含一些控件,您也可以在此处添加它们。

有一种方法可以通过XamlReader执行此操作,但我从未尝试过。

这是一篇简短文章的链接:

arcanecode.com

答案 1 :(得分:0)

对于上面的XAML,我会这样做:

在每个按钮名称“添加新输入行”的点击事件句柄中,我的意思是您可以将此事件用于所有按钮。

private void btn_Click(object sender, RoutedEventArgs e)
        {
            Button btn = sender as Button;
            StackPanel stkButtonParent = btn.Parent as StackPanel;
            StackPanel stkCover = stkButtonParent.Parent as StackPanel;
            StackPanel newRow = NewRow();
            stkCover.Children.Add(newRow);
        }

        private StackPanel NewRow() {
            StackPanel stk = new StackPanel();
            stk.Orientation = Orientation.Horizontal;
            Label lbl = new Label();
            lbl.Foreground = Brushes.Red; // some attribute
            TextBox txt = new TextBox();
            txt.Background = Brushes.Transparent; // some attribute
            Button btn = new Button();
            btn.Content = "Add new row";
            btn.Click += btn_Click;
            stk.Children.Add(lbl);
            stk.Children.Add(txt);
            stk.Children.Add(btn);
            return stk;
        }