我有一个按钮,按下它时会将文本框和列表框添加到堆栈面板,并将此堆栈面板添加到另一个名为“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中的最后一个元素?
答案 0 :(得分:7)
尝试:
if (stackPanelAdd.Children.Count>0)
{
stackPanelAdd.Children.RemoveAt(stackPanelAdd.Children.Count-1);
}
答案 1 :(得分:2)
这不是一个好主意,如果你坚持使用这种方法,事情迟早会变得非常混乱。在处理可在WPF中添加和删除的项目时,您需要在面板顶部使用某种ItemsControl
(您可以使用ItemsPanel
属性更改面板,默认情况下它将是一个StackPanel
)。
使用data templates和data binding作为您应该熟悉的核心机制,也可以改进控件的创建。
一个例子:
<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
中的项目应包含绑定属性Name
和Items
,然后您可以为其分配值或从中输入文本(该类应实现INPC
,详细了解article on data binding)中的那些内容。
答案 2 :(得分:1)
您可以使用
var lastControl = stackPanelAdd.Children.LastOrDefault();
//Last is defined in System.Linq.Enumrable
if(lastControl != null)
stackPanelAdd.Children.Remove(lastControl);
答案 3 :(得分:0)
@Milan Halada的答案对我来说有点变化,
while (stackPanelAdd.Children.Count>0)
{
stackPanelAdd.Children.RemoveAt(stackPanelAdd.Children.Count-1);
}
所以,它删除了所有的孩子,然后我使用for循环动态添加新子项,并使用新数据。