2014-09-05 77 views
0

有沒有辦法在c#中編寫多個項目的一個屬性。例如我有5個按鈕,我不想寫button1.text = "etc",button2.text = "etc,我想寫button.text="etc",並有button1.text通過button5.text來具有「等」文本。多個按鈕的一個屬性

+0

您可以創建一個數組。 – SLaks 2014-09-05 21:53:00

+1

如果答案正確並解決了您的問題,請接受您選擇的答案,以便其他有相同問題的社區成員知道您的工作方式。 – 2014-09-06 12:22:32

回答

1

您不能將所有5個按鈕分配給相同的參考,以便button.text = "etc"可以工作。

但是,您可以綁定按鈕相同的屬性:

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

如果與INotifyPropertyChanged正確設置綁定,那麼一切都將更新時myText被更新。

您也可以將控件放入一個集合中,然後按照其他人的建議設置他們的Content屬性。

+0

+1沒有想到使用綁定。 – 2014-09-05 22:11:18

2

我想這是類似的東西是可行的:

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 Property

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

由於LogicalChildren有一個受保護的訪問,你需要通過一個派生類,它應便於任何一種你在Windows Phone上的工作頁面的訪問它,我猜。

或者將Grid右移到PhoneApplicationPage上,然後放下其他控件(如按鈕),然後通過Grid.Children屬性訪問它們。

因此,已經下降了您的Grid並將其命名爲myBaseGrid,一會做到以下幾點:

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

我會親自去與這名使得該方法你被拼寫的單詞Button做清楚什麼複數如我的樣本。

+0

+1爲「一條線」的做法。從電話8開始,它可能是'Children'而不是'Controls'',但 – BradleyDotNET 2014-09-05 21:59:58

+0

@BradleyDotNET:請參閱我的編輯。 – 2014-09-05 22:47:47

+0

感謝您的信息!我很驚訝他們擺脫了'Children'集合,並用'LogicalChildren'取代了它。無論如何,如果出於某種原因,綁定不是一個選項,我仍然會使用這種方法。 – BradleyDotNET 2014-09-05 22:50:04

1

一個方法是創建一個集所有這些爲你的方法,你必須手動編寫一次:

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; 
    } 
} 
+0

+1或者和我的答案一樣,除了'foreach loop'語法。它應該工作。 – 2014-09-05 22:10:52

+1

True ...在我發佈之前,我沒有看到您的答案。偉大的思想......:p – 2014-09-05 22:18:10

+0

嘿嘿嘿......我知道有時候在答案上會有一些併發。當我發佈我的時候,你可能正在寫你的。 ;)偉大的思想仍然! = P – 2014-09-05 22:19:38

0

簡而言之:將所有應該在列表中更改的按鈕分組。然後稍後循環訪問此列表並設置所有按鈕的文本。

這是一些代碼。
首先:

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

上的Form_Load:

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

現在這取決於 '當' 或 '地方' 你想改變它。如果按鈕在開始時應該正確更改,請將以下代碼放入form_load事件中。否則,當它應該被解僱時,將其放入事件中。

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

你也可以像這樣處理多個標籤或盒子等。只需聲明正確的數據類型即可。

問候