从网格控件中删除特定类型的子项

时间:2010-04-09 05:47:07

标签: wpf wpf-controls

我想从网格控件中删除类型为border的假设控件。如何在WPF C#中实现它?

抱歉伙计们,我的问题是我的网格控件在XAML端有GUI设计,用户控件是用C#添加的,有些控件是重叠的。删除了一些控件,但留下了一些相互重叠的控件。如何删除所有控件。您发布的代码用于控制,这些代码不重叠,但对于重叠的代码,它不起作用。

4 个答案:

答案 0 :(得分:5)

这是我的代码:

 int intTotalChildren = grdGrid.Children.Count-1;
            for (int intCounter = intTotalChildren; intCounter > 0; intCounter--)
            {
                if (grdGrid.Children[intCounter].GetType() == typeof(Border))
                {
                    Border ucCurrentChild = (Border)grdGrid.Children[intCounter];
                    grdGrid.Children.Remove(ucCurrentChild);
                }                
            }

我的错误是,每次我在Children.Count循环中使用for时,每次删除一个孩子时,Children.Count都会更改,而不是所有的孩子都被删除了。

答案 1 :(得分:0)

好吧,你可以走VisualTree并删除任何类型为Border的内容。

static public void RemoveVisual(Visual myVisual)
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(myVisual); i++)
    {
        Visual childVisual = (Visual)VisualTreeHelper.GetChild(myVisual, i);

        if(childVisual.GetType() == typeof(Border))
        {
            // Remove Child
        }

        // Enumerate children of the child visual object.
        RemoveVisual(childVisual);
    }
}

我留给您的删除,但上面应该在Border类型的视觉内找到所有控件。

答案 2 :(得分:0)

试试这个,grd是Grid Contol

    <Grid x:Name="grd">
    <Border x:Name="test1" Margin="5"
            Background="red"
            BorderBrush="Black"
            BorderThickness="5"></Border>
    <Button VerticalAlignment="Bottom" Content="Hello" Click="test"></Button>
</Grid> 

        for(int i=0; i< VisualTreeHelper.GetChildrenCount(grd);i++){
Visual childVisual = (Visual)VisualTreeHelper.GetChild(grd, i);
if (childVisual is Border)
{
    grd.Children.Remove((UIElement)  childVisual);
}

答案 3 :(得分:0)

这是我在网格子集合中删除所有边框控件的解决方案

    int indice = 0;
    int childrens = TargetGrid.Children.Count;
    for (int i = 0; i < childrens; i++)
    {
        Border brd = TargetGrid.Children[indice] as Border;
        if (brd != null)
        {
            //Remove children
            TargetGrid.Children.RemoveAt(indice);
        }
        else
        {
            indice++;
        }
    }