我有一个带有许多标签的WPF应用程序。
<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;
}
有没有办法做到这一点?
答案 0 :(得分:6)
如果您的标签都是一致的,那么您可以这样做:
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 :(得分: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>
答案 2 :(得分: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
}
答案 3 :(得分: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";
答案 4 :(得分: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;
...
...
答案 5 :(得分:0)
您可以通过绑定来实现它!
xaml视图:
<ItemsControl ItemsSource="{Binding List}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Value, Mode=TwoWay}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
在构造函数后面的代码中:
DataContext = new ViewModelClass();
在ViewModelClass中:
class ViewModelClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
private ObservableCollection<StringObject> _List = new ObservableCollection<StringObject>();
public ObservableCollection<StringObject> List
{
get { return _List; }
set
{
_List = value;
NotifyPropertyChanged("List");
}
}
public ViewModelClass()
{
List = new ObservableCollection<StringObject>
{
new StringObject {Value = "your"},
new StringObject {Value = "list"},
new StringObject {Value = "of"},
new StringObject {Value = "string"}
};
}
}
public class StringObject
{
public string Value { get; set; }
}
请注意类型为string
的集合不起作用,您必须使用一个对象=> StringObject