2012-02-21 129 views
2

我有一個按鈕,當按下時,它將一個文本框和一個列表框添加到一個堆棧面板,並將此堆棧面板添加到另一個名爲「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); 
} 

如何刪除堆疊面板「stackPanelAdd」中的最後一個孩子? 我應該使用類似stackPanelAdd.children.Remove的東西嗎?如果是這樣,那麼我如何獲得堆疊面板中的最後一個元素?

回答

7

嘗試:

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

雖然這工作完美! :D謝謝! – 2012-02-21 10:59:16

1

您可以使用

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

無法使Last()函數正常工作。有沒有我需要你的參考? – 2012-02-21 10:58:23

+0

正如我所提到的,你將不得不導入/使用System.Linq – Maheep 2012-02-21 11:00:26

+1

你想要LastOrDefault()或者你可能會得到一個異常 – Phil 2012-02-21 14:08:27

2

這不是一個好主意,如果你堅持這個方法的事情可能會得到非常混亂遲早的事。當處理可以在WPF中添加和刪除的項目時,您將需要在面板上使用某種ItemsControl(您可以使用ItemsPanel屬性更改面板,默認情況下它將爲StackPanel)。

也可以使用data templatesdata 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中的項目應該包含綁定屬性NameItems,然後您可以爲其分配值或從中輸入文本(該類應實現INPC,在article on data binding中閱讀更多關於這些內容的內容)。

0

@Milan Halada的回答帶着些許變化工作對我來說,

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

所以,它會刪除所有的孩子,然後我新的兒童添加到它動態地使用循環,用新的數據。