1

如果标题不好,我深表歉意,我不知道如何表达自己对这个问题的看法。

我有一个用 C# WPF 编写的程序,其中有许多 TabItems。在这些 TabItems 中,我有几个文本框、复选框等。在这些“主”TabItems 中还有包含文本框、复选框等的附加 TabItems。我想要做的是能够将这些控件的所有值存储在 xml 文件中。通过站在一个主要的 TabItems 中并执行以下代码,我设法为所有可见的对象做到了这一点:

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. 

然后我将它们存储在所需的文件中,这对于可见的文件来说效果很好。但是我该怎么做才能包含所有“第二个”TabItems 中的所有控件以及“主要”TabItems 中的所有控件?我已经测试过在第一个完成后将 Selected TabItem 更改为增加这个,但这似乎不起作用......

程序的基本草图(不,我没有得到好成绩

4

3 回答 3

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
        }
    }
}
于 2013-06-05T11:30:49.877 回答
0

作为迭代所有控件的替代方法,您还可以考虑对它们进行数据绑定。这样,您只需从数据源获取数据并将其写入 XML 文件。

类中的每个控件都必须有一个属性,并且在您的 XAML 中,您必须将每个控件绑定到其属性。然后,您必须将窗口的数据上下文设置为该类的实例。

您可能想阅读一些关于WPF 数据绑定的内容。

于 2013-06-05T11:38:39.357 回答
0

您应该为内部选项卡命名,然后使用它们的名称搜索它们。在这里你可以找到一些解释:find control by name

于 2013-06-05T10:56:08.870 回答