所以你知道在c#中如何使用普通形式,你可以循环一个面板并获取其中的所有标签? 所以你可以这样做:
foreach(Label label in Panel.Controls)
有没有办法为网格做到这一点?
之类的东西foreach(Lable lable in Grid)
所以这个foreach可以在一个传递网格对象的函数中,如此
private void getLabels(Grid myGrid)
{
foreach(Label label in myGrid)
}
如果我这样做,它告诉我“错误CS1579:foreach语句不能对'System.Windows.Controls.Grid'类型的变量进行操作,因为'System.Windows.Controls.Grid'不包含'的公共定义'的GetEnumerator'“
我现在知道的另一种做法吗?
任何帮助都将不胜感激。
答案 0 :(得分:4)
normal forms
- WPF使用正常方式在2014年进行.Net Windows用户界面。
如果你正在使用WPF,你需要留下你从古代技术中获得的任何和所有概念,并理解并拥抱The WPF Mentality。
基本上,你不会在WPF中“迭代”任何东西,因为绝对没有必要这样做。
用户界面的责任是显示数据,而不是存储它,操纵它。因此,您需要显示的任何数据都必须存储在正确的数据模型或ViewModel中,并且UI必须使用正确的DataBinding来访问该数据,而不是程序代码。
所以,例如,假设您有一个Person
类:
public class Person
{
public string LastName {get;set;}
public string FirstName {get;set;}
}
您需要将用户界面的DataContext设置为以下列表:
//Window constructor:
public MainWindow()
{
//This is required.
InitializeComponent();
//Create a list of person
var list = new List<Person>();
//... Populate the list with data.
//Here you set the DataContext.
this.DataContext = list;
}
然后,您需要在ListBox
或其他基于ItemsControl
的用户界面中显示该内容:
<Window ...>
<ListBox ItemsSource="{Binding}">
</ListBox>
</Window>
然后您将要使用WPF的Data Templating功能来定义如何在UI中显示Person
类的每个实例:
<Window ...>
<Window.Resources>
<DataTemplate x:Key="PersonTemplate">
<StackPanel>
<TextBlock Text="{Binding FirstName}"/>
<TextBlock Text="{Binding LastName"/>
</StackPanel>
</DataTemplate>
</Window.Resources>
<ListBox ItemsSource="{Binding}"
ItemTemplate="{StaticResource PersonTemplate}"/>
</Window>
最后,如果您需要在运行时更改数据,并在UI中反映这些更改(显示),那么您的DataContext类必须Implement INotifyPropertyChanged
:
public class Person: INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
var handler = PropertyChanged;
if (handler != null)
handler(this, new PropertyChangedEventArgs(name));
}
private string _lastName;
public string LastName
{
get { return _lastName; }
set
{
_lastName = value;
OnPropertyChanged("LastName");
}
}
private string _firstName;
public string FirstName
{
get { return _firstName; }
set
{
_firstName = value;
OnPropertyChanged("FirstName");
}
}
}
最后,您遍历List<Person>
并更改数据项的属性,而不是操纵UI:
foreach (var person in list)
person.LastName = "Something";
单独离开用户界面。
答案 1 :(得分:2)
通过Grid.Children迭代并将所有内容都转换为Label。如果它不为null,则表示您已找到标签。