如果标题不好我道歉,我不知道如何表达自己对这个问题的看法。
我有一个用C#编写的程序,WPF,我有很多TabItems。在这些TabItems中,我有几个文本框,复选框等。在这些“主要”TabItems内部还有包含文本框,复选框等的其他TabItems。我想要做的是能够存储所有值这些控件在xml文件中。我已经设法通过站在其中一个主TabItem并执行以下代码来完成所有可见的:
List<TextBox> allTxt = FindVisualChildren<TextBox>(this).ToList<TextBox>(); // this here is my MainWindow (Interaction logic for MainWindow.xaml)
foreach (TextBox t in allTxt)
list.Add(t.Name + ":" + t.Text); // list is a List I store these in
//The same goes later for checkboxes etc.
然后我将它们存储在所需的文件中,这对于可见的文件很好。但是我怎么能包括所有“第二”TabItem的所有控件以及“主要”TabItem中的所有控件呢? 我已经测试过更改Selected TabItem以在第一个完成之后增加这个,但这似乎不起作用......
答案 0 :(得分:1)
也许是一种“蛮力”的方法,但它干净且易于阅读......
List<String> textBoxes = new List<String>();
List<String> checkBoxes = new List<String>();
foreach (TabPage mainPage in mainTabControl.TabPages)
{
foreach (Control c in mainPage.Controls)
{
if (c is TabControl)
{
foreach (TabPage secondPage in ((TabControl)c).TabPages)
{
foreach (Control c2 in secondPage.Controls)
{
if (c is CheckBox)
checkBoxes.Add(((CheckBox)c).Name + ":" + (((CheckBox)c).Checked ? "True" : "False"));
else if (c is TextBox)
textBoxes.Add(((TextBox)c).Name + ":" + (((TextBox)c).Text));
//... add more for other controls to capture
}
}
}
else
{
if (c is CheckBox)
checkBoxes.Add(((CheckBox)c).Name + ":" + (((CheckBox)c).Checked ? "True" : "False"));
else if (c is TextBox)
textBoxes.Add(((TextBox)c).Name + ":" + (((TextBox)c).Text));
//... add more for other controls to capture
}
}
}
答案 1 :(得分:0)
您应该为内部标签指定名称,然后使用其名称搜索tham。您可以在此处找到一些解释:find control by name
答案 2 :(得分:0)
作为迭代所有控件的替代方法,您还可以考虑对它们进行数据绑定。这样,您只需从数据源获取数据并将其写入XML文件。
类中的每个控件都必须有一个属性,在XAML中,您必须将每个控件绑定到其属性。然后,您必须将窗口的数据上下文设置为类的实例。
您可能想了解一下WPF data binding。