【发布时间】:2015-06-28 10:08:45
【问题描述】:
我想从网格控件中删除一个类型为边框的假设控件。如何在 WPF C# 中实现它?
对不起,伙计们,我的问题是我有网格控件,它在 XAML 端具有 GUI 设计,而用户控件是使用 C# 添加的,并且一些控件是重叠的。删除了一些控件,但留下了一些相互重叠的控件。如何删除所有控件。您发布的代码适用于不重叠的控制,但对于重叠的控制,它不起作用。
【问题讨论】:
标签: wpf wpf-controls
我想从网格控件中删除一个类型为边框的假设控件。如何在 WPF C# 中实现它?
对不起,伙计们,我的问题是我有网格控件,它在 XAML 端具有 GUI 设计,而用户控件是使用 C# 添加的,并且一些控件是重叠的。删除了一些控件,但留下了一些相互重叠的控件。如何删除所有控件。您发布的代码适用于不重叠的控制,但对于重叠的控制,它不起作用。
【问题讨论】:
标签: wpf wpf-controls
这是我的代码:
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。
好吧,您可以遍历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类型的视觉中的所有控件。
【讨论】:
试试这个,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);
}
【讨论】:
这是我删除网格子集合中所有边框控件的解决方案
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++;
}
}
【讨论】: