使用C#与Wpf tabitem控件循环?
大家好,我熟悉windows窗体,现在我要启动WPF,在windows中,我用以下递归方法重置控件使用C#与Wpf tabitem控件循环?,c#,wpf,winforms,recursion,C#,Wpf,Winforms,Recursion,大家好,我熟悉windows窗体,现在我要启动WPF,在windows中,我用以下递归方法重置控件 internal void clrCntrls(Control cntrl) { if (cntrl.GetType() == typeof(TextBox)) { TextBox cntrl = (TextBox)cntrl; cntrl.Text = "";
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中学到的一切,理解并接受它
在winforms中,我使用以下递归方法重置控件
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);
}
}
在WPF中,您不会“重置控件”,实际上也不会对控件做太多的操作,原因很简单
相反,您要做的是将您的UI声明为相关的数据模型或视图模型,并对其进行操作
因此,假设定义一些数据,如:
public class Person
{
public string FirstName {get;set;}
public string LastName {get;set;}
}
然后在XAML中定义()一块UI来显示数据:
<StackPanel>
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
要“清除”这些文本框,您要做的是将它们分配给数据类的一个新的、清除的实例:
DataContext=newperson()代码>
我建议你开始阅读WPF心理链接
祝你好运
我熟悉windows窗体,现在我要启动WPF
好极了。欢迎来到光明面
你需要做的第一件事是完全忘记你在winforms中学到的一切,理解并接受它
在winforms中,我使用以下递归方法重置控件
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);
}
}
在WPF中,您不会“重置控件”,实际上也不会对控件做太多的操作,原因很简单
相反,您要做的是将您的UI声明为相关的数据模型或视图模型,并对其进行操作
因此,假设定义一些数据,如:
public class Person
{
public string FirstName {get;set;}
public string LastName {get;set;}
}
然后在XAML中定义()一块UI来显示数据:
<StackPanel>
<TextBlock Text="{Binding LastName}"/>
<TextBlock Text="{Binding FirstName}"/>
</StackPanel>
要“清除”这些文本框,您要做的是将它们分配给数据类的一个新的、清除的实例:
DataContext=newperson()代码>
我建议你开始阅读WPF心理链接
祝您好运。您可以尝试使用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);
}
}
}
private void ClearControls(DependencyObject根)
{
for(int i=0;i0),则为else
{
ClearControls(控制);
}
}
}
我的建议是利用MVVM模式。在这种情况下,将控件内容绑定到视图模型类中的属性。要清除这种情况下的所有控件,只需将DataContext
替换为视图模型类的新实例。查看HighCore的答案了解详细信息。您可以尝试使用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);
}
}
}
private void ClearControls(DependencyObject根)
{
for(int i=0;i0),则为else
{
ClearControls(控制);
}
}
}
我的建议是利用MVVM模式。在这种情况下,将控件内容绑定到视图模型类中的属性。要清除这种情况下的所有控件,只需将DataContext
替换为视图模型类的新实例。查看HighCore的答案了解详细信息。您想要实现什么?我想要清除控件中的数据您想要实现什么?我想要清除控件中的数据+1出色的记录。我确信@HighCore不想把答案弄得乱七八糟,因为WPF中有很多内容要介绍,但是对于要响应的绑定,不要忘记在这个示例中,Person
,类要实现INotifyPropertyChanged,并在XAML绑定中使用的属性上引发PropertyChanged事件。@Denismorzov没错。WPF的内容远不止这些,但我发布的所有链接都应该让OP开始了。+1精彩的评论。我确信@HighCore不想把答案弄得乱七八糟,因为WPF中有很多内容要介绍,但是对于要响应的绑定,不要忘记在这个示例中,Person
,类要实现INotifyPropertyChanged,并在XAML绑定中使用的属性上引发PropertyChanged事件。@Denismorzov没错。WPF的内容远不止这些,但我发布的所有链接都应该让OP开始。@Pallavi值得一提的是,由于UI虚拟化
和WPF内容模型以及TabControl动态创建和销毁UI元素的方式,这种方法存在各种各样的问题