2013-06-04 6 views
6

Birçok etiketli bir WPF uygulamasına sahibim. Bunu yapmanın bir yoluXAML tanımlı etiketler üzerinde döngü

for(int i = 1; i<40 ;i++) 
{ 
    label"i".content = i*10; 
} 

var mı: Ben daha böyle yapmak istiyorum

label1.content= 1; 
label2.content= 20; 
label3.content= 30; 
.... 

:

<Label x:Name="label1" /> 
<Label x:Name="label2" /> 
<Label x:Name="label3" /> 
.... 

ben gibi biri tarafından her etiket değeri tek vermek istemiyorum?

+3

Eğer etiket dizisi oluşturabilir, ardından loop-through? – Sam

+0

Etiketlerimi xaml gibi oluşturdum: user2261524

+0

Etiketlerinizi oluşturmak için bir kod arkasında bir seçenek var mı? – Sam

cevap

5

, bunu şöyle yapabilirsiniz:

var numberOfLabels = 40; 

for(int i = 1; i <= numberOfLabels; i++) 
{ 
    var labelName = string.Format("label{0}", i); 
    var label = (Label) this.FindName(labelName); 
    label.Content = i * 10; 
} 
1

Tüm bu Label formun yapıcısı içinde bir List<Label> ekleyebilirsiniz.

Bu çok sıkıcı bir iştir, ancak bunu sadece bir kez yapmanız gerekecektir.

List<Label> labels = new List<Label>(); 
labels.Add(label1); 
// etc. 

// loop 
for (int i = 0; i < labels.Count; i++) 
    labels[i].Text = i.ToString(); 

// alternative loop 
foreach (Label label in labels) 
    label.Text = "test"; 
3

Bağlama ile çalışıyorsanız, kolaydır. Etiket içeriğinizi ViewModel'inizde bir ObservableCollection<string> içinde tutmanız gerekir. Ve sonra, senin istediğin her şeyi, senin iterasyonunda, onlarla yapabilirsin.

Düzenleme 1: türüne göre tüm denetimleri numaralandırabilmesidir Bu kodu

public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject 
{ 
    if (depObj != null) 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(depObj, i); 
      if (child != null && child is T) 
      { 
       yield return (T)child; 
      } 

      foreach (T childOfChild in FindVisualChildren<T>(child)) 
      { 
       yield return childOfChild; 
      } 
     } 
    } 
} 

kullanma

 <ItemsControl ItemsSource="{Binding MyLabelValues}"> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <sdk:Label Content="{Binding Mode=TwoWay}"></sdk:Label> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
+0

Kabul ediyor. Gitmenin yolu bu olmalı! –

2

:

Ayrıca xaml gibi bir şey olmalıdır.

foreach (Label lbl in FindVisualChildren<Label>(window)) 
{ 
    // do something with lbl here 
} 
1

Bu nasıl?

List<Label> labelL = new List<Label>(); 

for(int i = 1; i<40 ;i++) 
    labelL.Add(new Label{ Name = "label"+i, Content = i*10 }); 

Son sonuç şudur. Etilketler tüm tutarlı adlandırılmışlarsa

label1.Text = 10; 
label2.Text = 20; 
label3.Text = 20; 
... 
...