使用特定命名的项目设计for循环

时间:2016-10-09 19:52:31

标签: c# wpf for-loop coding-style graphical-interaction

我在为GUI编写代码时经常遇到这种情况,并且想知道这将是解决这个问题的最佳实践方法。情况是这样的:

我的GUI上有许多相同的项目,它们有不同的变量名称,即我有10个“相同”的按钮,分别命名为Button1,Button2,Button3等......

按钮的显示文本在代码中更新,如果满足特定条件,我想检查它们何时更新,然后根据该条件更改文本颜色。所以对于button1我会写:

if (Button1.text == "true"){
    Button1.textcolor = blue}
else if (Button1.text == "false"){
    Button1.textcolor = red}

现在,为10个按钮中的每个按钮再次编写此代码似乎是多余的,用Button2替换Button1的变量名,依此类推,直到Button10。有没有办法在循环中更改代码的“Button1”部分并保持其他所有内容相同?所以我正在寻找的伪代码示例是:

for (all buttons in (button1-button10)){
    if (thisbutton.text == "true"){
        thisbutton.textcolor = blue}
    else if (thisbutton.text == "false"){
        thisbutton.textcolor = red}}

我不知道如何最好地处理这种情况,并希望得到关于此的输入和指导。

由于

3 个答案:

答案 0 :(得分:1)

每当你有一组类似的对象时,不要为这些对象的每个实例创建一个变量,而是将它们放在一个单独的集合中。然后,您可以轻松地循环此列表并操纵其中的对象:

var buttons = new List<Button>();

// put the buttons into the list using buttons.Add

for (var b in buttons)
{
    if (b.text == "true")
    {
        b.textcolor = blue
    }
    else 
    {
        b.textcolor = red
    }
}

您还可以使用GridView将所有这些按钮放入一个拉格网格中。

答案 1 :(得分:0)

创建自己的按钮。

using System.Windows.Forms;
using System.Drawing;

namespace TestApp
{
    public class TheButton : Button
    {
        public void ChangeColor()
        {
            ForeColor = (Text == "true")  ? Color.Blue : Color.Red ;

        }
    }
}

重建您的解决方案,您应该在工具箱中看到TheButton,在表单中,添加容器类,如面板,并添加TheButton类的实例。

然后您可以编写一个方法,例如:

    private void ChangeAllButtons()
    {
        foreach (var control in panel1.Controls.Cast<object>().Where(control => (control as TheButton) != null))
        {
            (control as TheButton).ChangeColor();
        }
    }

您必须决定调用ChangeAllButtons()的最佳位置。

答案 2 :(得分:0)

有很多方法可以解决这个问题。

由于按钮是由设计师创建的窗口/面板的字段,要列出它们,您必须分析 WPF 树(或在主窗口面板上使用反射,它是&#39;不是很优雅。)

要获得所有class SomeHandler(SomeMoreGenericHandler): def prepare(self): super().prepare() if not self.current_user: self.redirect('/login') raise tornado.web.Finish 个孩子,您可以使用此方法:

Button

然后调用它:

public static IEnumerable<T> EnumVisualOfType<T>(Visual visual) where T : Visual
{
    for (var i = 0; i < VisualTreeHelper.GetChildrenCount(visual); i++)
    {
        var visualChild = (Visual)VisualTreeHelper.GetChild(visual, i);

        foreach (var child in EnumVisualOfType<T>(visualChild))
            yield return child;

        var childVisual = visualChild as T;

        if (childVisual != null)
            yield return childVisual;
    }
}

你有所有按钮的列表(当然,你可以根据需要过滤特定属性),你可以编写一次代码并在foreach循环中使用它。

您还可以在创建面板时将所有按钮显式添加到列表中,但是每次创建新面板时都必须记住手动添加它们。