我在WPF应用程序的包装面板中有一堆程序创建的控件。第一个控件是一个标签,后跟一堆组合框和一个复选框。用户单击一个按钮,然后添加新的控件行。这很好。然后,我决定通过给它一个红色圆圈作为背景使该标签更具吸引力,并将该标签嵌套在一个网格中,在该标签后面的红色圆圈仅列出行号。这很好。我经常使用此代码块浏览所有控件:
foreach (Control item in WrapPanelItems.Children)
{
if (item.GetType() == typeof(CheckBox))
{
RowCounter++;
}
}
现在此代码块突然失败,并出现以下错误:“无法将类型为“ System.Windows.Controls.Grid”的对象强制转换为类型为“ System.Windows.Controls.Control”。”
因此,我怀疑网格不是常规项目,并且代码失败。但是,我又该如何遍历控件而又不会使应用程序崩溃,而仍然遍历其顶部的所有常规控件?
这是我如何设置样式和添加标签的代码。
Grid MyGrid= new Grid();
Ellipse myEllipse = new Ellipse();
SolidColorBrush mySolidColorBrush = new SolidColorBrush();
mySolidColorBrush.Color = Color.FromArgb(255, 107, 142, 35);
myEllipse.Fill = mySolidColorBrush;
myEllipse.Width = 20;
myEllipse.Height = 20;
MyGrid.Children.Add(myEllipse);
Label LabelCounter = new Label();
LabelCounter.Content = RowCount.ToString();
MyGrid.Children.Add(LabelCounter);
LabelCounter.VerticalAlignment = VerticalAlignment.Center;
LabelCounter.HorizontalAlignment = HorizontalAlignment.Center;
WrapPanelItems.Children.Add(MyGrid);
还有第二个问题。假设我想更改标签上的文本...如果标签嵌套在网格中,我将如何到达标签?您可以直接在FOR循环拾取网格时直接更改内容吗?还是在FOR循环中识别出网格后再说网格的所有子级?
tx
答案 0 :(得分:0)
Grid
不是System.Windows.Controls.Control
,因此此行引发异常:
foreach (Control item in WrapPanelItems.Children)
您可以将Control
替换为UIElement
,以避免发生此错误。
根据MSDN:
public class Grid : System.Windows.Controls.Panel, System.Windows.Markup.IAddChild