逐步浏览包装面板中的控件

时间:2018-11-15 18:26:27

标签: c# wpf

我在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

1 个答案:

答案 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