0

您好我有一个表单应用程序,它使用基于名为 colorSlider 的跟踪栏的自定义控件。此控件是从代码项目中获得的,并添加到 VS2017 中的工具中。控制的各个方面工作正常。我可以随意更改任何属性。然而,最终的项目是相当大的,所有的轨迹栏(50 左右)都将被这个自定义控件所取代。我还希望能够使用用户自定义皮肤修改滑块的外观和感觉。所以,这里有一个典型的命令来改变滑块上的按钮。

colorSlider1.ThumbInnerColor = Color.FromArgb(99, 130, 208);

这工作得很好。但是我想循环执行此操作。所有控件都在一个称为背面板的面板上。这是更改按钮前景色的示例:

        foreach (Panel pnl in backPanel.Controls)
        {
            foreach (Control c in pnl.Controls)
            {
                if (c is Button)
                {
                    c.ForeColor = Color.Black;
                }
            }
        }

这很好用。但是,如果我尝试这个:

        foreach (Panel pnl in backPanel.Controls)
        {
            foreach (Control c in pnl.Controls)
            {
                if (c is ColorSlider.ColorSlider)
                {
                    c.ThumbInnerColor = Color.FromArgb(99, 130, 208);
                }
            }
        }

在这种情况下,Visual Studio 给出了语法错误

错误 CS1061“Control”不包含“ThumbInnerColor”的定义,并且找不到接受“Control”类型的第一个参数的可访问扩展方法“ThumbInnerColor”(您是否缺少 using 指令或程序集引用?)

所以有人知道如何解决这个问题吗?谢谢

4

3 回答 3

3

You could also use the Controls.OfType<> option:

        foreach(Panel pnl in backPanel.Controls.OfType<Panel>())
        {
            foreach(ColorSlider cs in pnl.Controls.OfType<ColorSlider>())
            {
                cs.ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
于 2019-02-24T06:05:39.513 回答
2

查看错误.. Control' 不包含'ThumbInnerColor' 的定义.. 这是真的.. Control不包含该属性。现在看看你的代码:

c.ThumbInnerColor = Color.FromArgb(99, 130, 208);

您正在尝试在类型为Control .. 的Object上设置属性,该属性属于ColorSlider类型的特定控件。

修复应该像将Control转换为ColorSlider一样简单

foreach (Panel pnl in backPanel.Controls)
    {
        foreach (Control c in pnl.Controls)
        {
            ColorSlider.ColorSlider slider = c as ColorSlider.ColorSlider;
            if (slider != null)
            {
                slider.ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
    }

或者

foreach (Panel pnl in backPanel.Controls)
    {
        foreach (Control c in pnl.Controls)
        {
            if (c is ColorSlider.ColorSlider)
            {
                (c as ColorSlider.ColorSlider).ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
    }

或者

foreach (Panel pnl in backPanel.Controls)
    {
        foreach (Control c in pnl.Controls)
        {
            if (c is ColorSlider.ColorSlider)
            {
                ((ColorSlider.ColorSlider)c).ThumbInnerColor = Color.FromArgb(99, 130, 208);
            }
        }
    }
于 2019-02-24T04:36:06.677 回答
2

或在较新的 C# 中

foreach (Panel pnl in backPanel.Controls)
{
    foreach (Control c in pnl.Controls)
    {
        if (c is ColorSlider.ColorSlider s)
        {
            s.ThumbInnerColor = Color.FromArgb(99, 130, 208);
        }
    }
}
于 2019-02-24T04:58:13.540 回答