2013-06-04 45 views
6

我有一个带有许多标签的WPF应用程序。循环遍历XAML定义的标签

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

我不想被人喜欢给每一个标签值之一:

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

我希望做更多这样的:

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

有没有办法做到这一点?

+3

您可以创建标签的数组,然后环通? – Sam

+0

我在xaml中创建了如下标签:

+0

创建标签的选项是代码隐藏吗? – Sam

回答

5

如果您的标签都统一进行命名,你可以做这样的:

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

您可以将所有这些Label添加到窗体的构造函数中的List<Label>

这是一项单调乏味的工作,但你只需要做一次。

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

如果你使用绑定工作很容易。您只需将您的标签内容保存在您的ViewModel的ObservableCollection<string>中。然后,在你的情况下,你可以随心所欲地做任何事情。

编辑1:

而且你的XAML应该是这样的:

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

同意。这应该是要走的路! –

2

使用此代码

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

您可以通过枚举类型的所有控件。

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

这个怎么样?

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

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

最终结果就是这样。

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