【问题标题】:Remove Specific Type of Children from Grid Control从网格控件中删除特定类型的子项
【发布时间】:2015-06-28 10:08:45
【问题描述】:

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

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

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    这是我的代码:

     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);
                    }                
                }
    

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

    【讨论】:

    • 这个循环有一个错误——我相信它应该是intCounter >= 0
    【解决方案2】:

    好吧,您可以遍历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类型的视觉中的所有控件。

    【讨论】:

    • @Asim,在你添加评论时正在这样做,呵呵。
    • 感谢您的帮助。但是我的代码中有错误。因为我已将网格的子项总数存储到单独的变量中。谢谢你的帮助。我的问题现在解决了。
    【解决方案3】:

    试试这个,grd是网格控制

        <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);
    }
    

    【讨论】:

      【解决方案4】:

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

          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++;
              }
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-27
        • 2020-06-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-02
        • 1970-01-01
        相关资源
        最近更新 更多