嗨,我熟悉windows窗体,现在我要启动WPF,在windows中,我用以下递归方法重置控件
internal void clrCntrls(Control cntrl)
{
if (cntrl.GetType() == typeof(TextBox))
{
TextBox cntrl = (TextBox)cntrl;
cntrl.Text = "";
}
else if (cntrl.GetType() == typeof(ComboBox))
{
ComboBox cntrl = (ComboBox)cntrl;
cntrl.SelectedIndex = -1;
}
else
{
foreach (Control subCntrl in _cntrl.Controls)
{
clrCntrls(subCntrl);
}
}
它在windows中对我来说很好,但在WPF中也一样。我对此有点困惑。请帮忙。
我熟悉windows窗体,现在我要启动WPF
非常棒。欢迎来到光明面。
你需要做的第一件事是完全忘记你在winforms中学到的一切,理解并接受WPF心态。
在winforms中,我用以下递归方法重置控件
在WPF中,您不会"重置控件",实际上也不会对控件做太多操作,因为UI不是数据。
相反,您所做的是声明性地将您的UI绑定到相关的数据模型或 视图模型因此,比如定义一些数据: 然后定义(IN XAML)一段UI来显示该数据: 为了"清除"这些文本框,您需要将它们的 我建议你开始阅读WPF心态链接。 祝你好运。public class Person
{
public string FirstName {get;set;}
public string LastName {get;set;}
}
<StackPanel>
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
DataContext
分配给数据类的一个新的、清除的实例:DataContext = new Person();
您可以尝试使用VisualTreeHelper
,但它只适用于当前在可视化树中的控件,即渲染控件。如果您有TabControl
,则无法访问当前未选择的TabItem
上的控件。
这里有一个快速的尝试:
private void ClearControls(DependencyObject root)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++)
{
var control = VisualTreeHelper.GetChild(root, i);
if (control is TextBox)
{
(control as TextBox).Text = String.Empty;
}
else if (control is ComboBox)
{
(control as ComboBox).Text = String.Empty;
}
else if (VisualTreeHelper.GetChildrenCount(control) > 0)
{
ClearControls(control);
}
}
}
我的建议是利用MVVM模式。在这种情况下,控件内容将绑定到视图模型类中的属性。在这种情况下,要清除所有控件,只需将DataContext
替换为视图模型类的新实例。查看HighCore的答案了解详细信息。