从StackPanel中删除子项

时间:2017-03-09 23:40:46

标签: c# wpf

for(int i = 0; i < stackPanel.Children.Count; i++)
{
     stackPanel.Children.Remove(stackPanel.Children[i]);
}
int x  = stackPanel.Children.Count();

运行上面的代码后。控件仍在屏幕上。然后x等于33.那么我该如何真正删除孩子呢?

3 个答案:

答案 0 :(得分:1)

stackPanel.Children会返回UIElementCollection,因此您可以像这样使用import React, { Component } from 'react'; import { ProgressViewIOS, ProgressBarAndroid, Platform } from 'react-native'; import { colors } from '~/utils/styles' export default class ProgressBar extends Component { constructor(props){ super(props) this.state = { start: props.start || 0, distance: props.distance, }; } componentDidMount(){ setTimeout(()=>{ this.updateProgress() }, 100) } updateProgress = () => { var start = this.state.start + 0.01; this.setState({ start }); if(start < this.state.distance){ requestAnimationFrame(() => this.updateProgress()); } } componentWillUnmount(){ clearTimeout(this.updateProgress) } render () { if(Platform.OS === 'ios'){ return ( <ProgressViewIOS progress={this.state.start} style={{height: 3}} progressViewStyle={'bar'} progressTintColor={this.props.progressTintColor} /> ) } if(Platform.OS === 'android'){ return ( <ProgressBarAndroid indeterminate={false} styleAttr="Horizontal" color={this.props.progressTintColor || colors.defaultBlue} progress={this.state.start} style={{height: 5}} /> ) } return null } }

Clear()

答案 1 :(得分:1)

如果没有好的Minimal, Complete, and Verifiable code example,就无法确切知道代码的作用,请不要介意确切地解释其行为。

但是,这里有一些观察结果:

  1. 根据您发布的代码,我希望删除某些 但是因为你在删除孩子的同时你改变了用来识别要移除的孩子的索引,所以你正在跳过一半的孩子。例如。当i为0时,删除第一个孩子。但这样做会导致第二个孩子成为第一个孩子。然后你增加i。所以下次循环时,你不会删除最初的第二个孩子,你删除原来是第三个孩子的东西。等等。

    您可以通过在结尾处开始索引并向后工作来解决此问题。或者只是始终在索引0处删除第一个子项,直到集合为空。无论哪种方式,您还可以使用RemoveAt()方法提高效率,该方法删除特定索引处的元素,而不是强制集合搜索直到找到元素。

    当然,还有Clear()方法。因此,如果您想一次删除所有元素,您可以使用它而不是自己编写循环。
  2. 你真的不应该首先操纵UIElementCollection你自己。如果你有这样的动态元素,你应该创建一个视图模型类来表示StackPanel中的每个元素,创建该类的实例并将它们添加到例如ObservableCollection<T>,然后将该集合绑定到使用ItemsSource作为ItemsControl StackPanel ItemsPanel ItemsControl的{​​{1}} while默认情况下)。

    完成后,您只需根据需要操作集合即可添加/删除/重新排列元素。当然,这样做可以避免你在这里犯的错误。 :)

答案 2 :(得分:0)

  

你能解释为什么不能一个一个地删除它们吗?

因为您正在修改迭代的同一个集合。因此,当你删除索引0处的元素然后将循环变量增加到1时,索引0处的新项将永远不会被删除。

你可以通过向后迭代来解决这个问题。这有效:

for (int i = stackPanel.Children.Count - 1; i >= 0; i--)
{
    stackPanel.Children.Remove(stackPanel.Children[i]);
}
int x = stackPanel.Children.Count;

或者您可以按照@StanleyS的建议调用stackPanel.Clear()方法。