从StackPanel中移除元素

3

我有一个按钮,按下它会向 stackPanelAdd 栈面板中添加一个文本框和一个列表框。代码如下:

private void buttonAdd_Click(object sender, RoutedEventArgs e)
{
    StackPanel sp = new StackPanel();
    TextBox tb = new TextBox();   
    ListBox lb = new ListBox();

    tb.Margin = new Thickness(5, 5, 5, 0);
    lb.Margin = new Thickness(5, 5, 5, 0);
    lb.Height = 200;

    sp.Children.Add(tb);
    sp.Children.Add(lb);

    stackPanelAdd.Children.Add(sp);
}

如何删除StackPanel“stackPanelAdd”中的最后一个子元素?我应该使用类似于stackPanelAdd.children.Remove的东西吗?如果是这样,那么我如何获取StackPanel中的最后一个元素?

4个回答

11

尝试:

if (stackPanelAdd.Children.Count>0)
{
  stackPanelAdd.Children.RemoveAt(stackPanelAdd.Children.Count-1);
}

3
那不是一个好主意,如果你坚持使用这种方法的话,事情迟早会变得非常混乱。当处理可以在WPF中添加和删除的项目时,你将需要在面板顶部使用某种ItemsControl(你可以使用ItemsPanel属性更改面板,默认情况下它将是一个StackPanel)。
控件的创建也可以通过使用数据模板数据绑定进行改进,这些都是你应该熟悉的核心机制。
一个例子:
<ItemsControl ItemsSource="{Binding Data}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <TextBox Text="{Binding Name}" Margin="5,5,5,0"/>
                <ListBox ItemsSource="{Binding Items}" Margin="5,5,5,0" Height="200"/>
            </StackPanel>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这里的Data是一个源集合,应该实现INotifyCollectionChanged,然后你只需要从该集合中删除一个项目,其对应的StackPanel就会消失。 Data中的项应包含绑定属性NameItems,然后你可以为其分配值或获取输入文本(该类应实现INPC,有关这些内容的更多信息,请参见数据绑定文章)。

这是一个好的(也是正确的)答案,但如果你在其中包含了带有“Data”的C#方面,那么它将是一个非常好的答案。我认为像Milan这样的答案在WPF和UWP等领域经常出现的原因是微软的文档不够专注,而快速hack更容易理解。数据绑定文章中大约有7700个单词,我没有看到明确的例子来支持你回答的后半部分。它读起来[几乎]像2000年的Java文档。(明确一点,我认为这是微软的失败,而不是你的失败——它可能存在。只是一个例子问题中的一根稻草。) - ruffin

1

你可以使用

var lastControl = stackPanelAdd.Children.LastOrDefault(); 
//Last is defined in System.Linq.Enumrable
if(lastControl != null)
    stackPanelAdd.Children.Remove(lastControl);

无法使Last()函数正常工作。我需要使用参考文献吗? - Phu Minh Pham
正如我之前提到的,您将需要导入/使用System.Linq。 - Maheep
1
你需要使用LastOrDefault(),否则可能会出现异常。 - Phil

1

@Milan Halada的答案对我有用,稍作修改即可。

while (stackPanelAdd.Children.Count>0)
{
  stackPanelAdd.Children.RemoveAt(stackPanelAdd.Children.Count-1);
}

所以,它会移除所有的子元素,然后我使用for循环动态地添加新的子元素,带上新的数据。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接