2013-06-04 31 views
6

Tôi có một ứng dụng WPF có nhiều nhãn.Lặp qua nhãn XAML được xác định

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

Tôi không muốn cung cấp cho tất cả các nhãn giá trị từng người một như:

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

tôi muốn làm điều đó như thế này:

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

Có cách nào để làm điều đó?

+3

Bạn có thể tạo ra một loạt các nhãn, sau đó vòng qua? – Sam

+0

Tôi đã tạo nhãn của mình trong xaml như:

+0

Mã có đằng sau tùy chọn tạo nhãn của bạn không? – Sam

Trả lời

5

Nếu nhãn của bạn đều được đặt tên một cách nhất quán, bạn có thể làm điều đó như thế này:

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

Bạn có thể thêm tất cả Label đó vào một List<Label> trong hàm tạo của biểu mẫu.

Đó là một công việc tẻ nhạt, nhưng bạn sẽ chỉ phải làm điều đó một lần.

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

Nếu bạn làm việc với ràng buộc thì thật dễ dàng. Bạn chỉ cần giữ nội dung nhãn của mình trong một ObservableCollection<string> trên ViewModel của bạn. Và sau đó, bạn có thể làm bất cứ điều gì bạn muốn với họ, trong trường hợp lặp lại của bạn.

Sửa 1:

Cũng XAML của bạn nên được một cái gì đó như:

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

Đồng ý. Đó sẽ là con đường để đi! –

2

Sử dụng mã này

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

Bạn có thể liệt kê tất cả các điều khiển theo loại.

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

Làm thế nào về điều này?

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

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

Kết quả cuối cùng sẽ là điều này.

label1.Text = 10; 
label2.Text = 20; 
label3.Text = 20; 
... 
... 
Các vấn đề liên quan