0

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

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

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

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

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

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

我不知道如何最好地处理这种情况,并希望对此提供意见和指导。

谢谢

4

3 回答 3

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
    }
}

您还可以使用 aGridView将所有这些按钮放入不规则网格中。

于 2016-10-09T20:06:38.493 回答
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() 的最佳位置。

于 2016-10-10T02:35:48.203 回答
0

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

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

要获取所有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;
    }
}

然后调用它:

var allButtons = EnumVisualOfType<Button>(window).ToList();

而且您拥有所有按钮的列表(当然,如果您愿意,您可以根据特定属性进行过滤),您可以编写一次代码并在 foreach 循环中使用它。

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

于 2016-10-10T09:03:39.737 回答