一个属性用于多个按钮

本文关键字:用于 属性 按钮 一个 | 更新日期: 2023-09-27 18:21:02

有没有一种方法可以在c#中为多个项编写一个属性。例如,我有5个按钮,我不想写button1.text = "etc"button2.text = "etc,我想写button.text="etc",并有button.text到button.text来有"etc"文本。

一个属性用于多个按钮

我想这在类似的情况下是可行的

public void SetButtonText(string value) {
    this.Controls.OfType<Button>().ToList().ForEach(b => b.Text = value);
}

或者通过属性相同:

public string ButtonText { 
    set { 
        Controls
            .OfType<Button>()
            .ToList()
            .ForEach(b => b.Text = value); 
    } 
}

编辑

经过进一步的研究,我发现在Windows Phone中没有直接访问页面控件的方法。因此,这完全取决于您是否希望退出PhoneApplicationPage:

在我看来,您的解决方案围绕Page.LogicalChildren属性

public class MyPage : Page {
    public string ButtonText {
        set { 
            LogicalChildren
                .OfType<Button>()
                .ToList()
                .ForEach(b => b.Text = value); 
        }
    }
}

由于LogicalChildren有一个受保护的访问器,您需要通过派生类来访问它,我想这对您在Windows Phone上使用的任何类型的页面都很方便。

或者将网格直接放到PhoneApplicationPage上,然后将其他控件(如按钮)放到上面,然后您可以通过Grid.Children属性访问它们。

因此,在去掉Grid并将其命名为myBaseGrid之后,可以执行以下操作:

public void SetButtonsText(string text) {
    myBaseGrid.Children
        .OfType<Button>()
        .ToList()
        .ForEach(b => b.Text = "myText");
}

我个人会采用这样的方法,即在我的样本中,用复数拼写单词Button,让名字清楚地表明你在做什么。

也许您正在寻找控制数组:http://msdn.microsoft.com/en-us/library/aa289500(v=vs.71).aspx?

不能将所有5个按钮都分配给同一个引用,这样button.text = "etc"就可以工作了。

但是,您可以将按钮绑定到相同的属性:

<Button Content="{Binding myText}"/>
<Button Content="{Binding myText}"/>
<Button Content="{Binding myText}"/>
<Button Content="{Binding myText}"/>

如果使用INotifyPropertyChanged正确设置了绑定,则当更新myText时,所有绑定都将更新。

您也可以将控件放入集合中,并按照其他人的建议对其进行foreach以设置其Content属性。

一种方法是创建一个方法,为您设置所有这些,您必须手动编写一次:

public void SetAllButtonTexts(string text)
{
    button1.text = text;
    button2.text = text;
    // . . .
}

或者,你可以使用一个循环:

public void SetAllButtonTexts(string btnText)
{
    foreach (var control in this.Controls.OfType<Button>())
    {
        (control).Text = btnText;
    }
}

如果你不想更新所有按钮,你可以做一件简单但不那么优雅的事情,那就是用一些自定义文本修改你想更改的按钮的Tag属性,并且只更新这些:

public void SetAllButtonTexts(string btnText, string tagText = "")
{
    foreach (var control in this.Controls.OfType<Button>()
        .Where(b => string.IsNullOrEmpty(tagText) 
            || (b.Tag != null && b.Tag.Equals(tagText))))
    {
        (control).Text = btnText;
    }
}

简单地说:将所有应该在列表中更改的按钮分组。然后稍后循环浏览此列表并设置所有按钮的文本。

这里有一些代码
首先:

public static List<Button> buttonList = new List<Button>{};

在form_load:上

buttonList.AddRange(new List<Button>{ button1,button2,button3,...}); // Group your buttons

现在它取决于你想更改它的"when"或"where"。如果按钮一开始就应该更改,请将以下代码放入form_load-event中。否则,当它应该在事件上激发时,将其放入事件中。

foreach(Button btn in buttonList)
{
    btn.Text = "Change all button-texts from list at one time.";
}

你也可以像这样处理多个标签或盒子等。只需声明正确的数据类型。

问候