我有一个带有 9 个 tabitems 的 tabcontrol。每个选项卡都有一系列文本框供用户输入数据。底部是一个清除按钮,连接到这个方法:
public void ClearTextBoxes()
{
ChildControls ccChildren = new ChildControls();
foreach (object o in ccChildren.GetChildren(rvraDockPanel, 2))
{
if (o.GetType() == typeof(WatermarkTextBox) || o.GetType() == typeof(DateBox) ||
o.GetType() == typeof(DigitBox) || o.GetType() == typeof(PhoneBox))
{
WatermarkTextBox water = (WatermarkTextBox)o;
water.Text = "";
}
else if (o.GetType() == typeof(ComboBox))
{
ComboBox combo = (ComboBox)o;
combo.SelectedIndex = -1;
}
else if (o.GetType() == typeof(CheckBox))
{
CheckBox check = (CheckBox)o;
check.IsChecked = false;
}
}
}
这工作得很好,但是我还有一个 MenuItem 允许用户清除所有选项卡。现在,清除按钮只会清除当前选定选项卡上的内容,而不会处理其他所有内容。我对如何执行此操作的想法是使用此循环遍历 tabitems:
for (int i = 0; i < 10; i++ )
{
tabSelection.SelectedIndex = i;
clearButton_Click(null, null);
}
它将翻阅所有选项卡,但不会清除任何内容。我曾尝试使用自动化,但结果相同。它似乎不会清除任何东西。
ChildControls 类:
class ChildControls
{
private List<object> listChildren;
public List<object> GetChildren(Visual p_vParent, int p_nLevel)
{
if (p_vParent == null)
{
throw new ArgumentNullException("Element {0} is null!", p_vParent.ToString());
}
this.listChildren = new List<object>();
this.GetChildControls(p_vParent, p_nLevel);
return this.listChildren;
}
private void GetChildControls(Visual p_vParent, int p_nLevel)
{
int nChildCount = VisualTreeHelper.GetChildrenCount(p_vParent);
for (int i = 0; i <= nChildCount - 1; i++)
{
Visual v = (Visual)VisualTreeHelper.GetChild(p_vParent, i);
listChildren.Add((object)v);
if (VisualTreeHelper.GetChildrenCount(v) > 0)
{
GetChildControls(v, p_nLevel + 1);
}
}
}
}
最佳答案
要使您的代码正常工作,您需要将以下行添加到您的清理方法中:
tabControl.SelectedIndex = i;
--> UpdateLayout();
Button_Click(null, null);
UpdateLayout 方法负责绘制 TabItem,之后 VisualTree 可用。
通常这种方法并不好,如果你有一个真正的应用程序背后有业务数据,我建议你看看数据绑定(bind)/MVVM。方法不应该是在 View 中重置您的控件,而是在后台重置您绑定(bind)的业务数据。
关于c# - 遍历 TabControl 中的 TabItems,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8507256/