【问题标题】:WPF - duplicating a stackpanelWPF - 复制堆栈面板
【发布时间】:2013-11-26 17:10:12
【问题描述】:

我有这个(粗略的例子):

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

非常不言自明,我想在每次单击按钮时添加一个新的 Horizo​​ntal StackPanel..

这可能吗?

谢谢!

【问题讨论】:

  • 是的。例如,使用ItemsPanel,将其绑定到ObservableCollection,使用StackPanel 作为内容或模板,并在按钮的onclick 事件处理程序中将项目添加到集合中。

标签: c# wpf xaml dynamic


【解决方案1】:

对于上面的这个 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;
        }

【讨论】:

    【解决方案2】:

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

        // 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

    【讨论】:

    • 您的新 StackPanel 将是空的,但 OP 想要一些 StackPanel 以及一些现有的控件。
    • @KingKing 好吧,他可以编写一个方法,用他想要的控件创建新的 StackPanel。但是我没有看到他提到它必须包含任何现有的控件。无论如何,只要他不提供更多细节,我就无法提供更多帮助。
    • 显然我会给它添加控件:)
    • @AdamBensh 这不是WPF 的方式,当然,如果您想将具有相同布局的相同控件添加到新的 StackPanel,您应该使用某种Template,这是一个WPF 非常强大的功能。
    • @AdamBensh 是的,这应该不是问题,只需在每次点击时添加控件,但是如果他们应该共享一些特定的模板或某事,那就可以了。你应该使用它。
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    • 1970-01-01
    • 2012-12-07
    • 1970-01-01
    相关资源
    最近更新 更多