1

我对 C# 很陌生,我又迷路了。我讨厌问这个问题,但我对理解它是如何工作的非常迷茫。我正在尝试遍历 WPF 表单上的 TextBoxes 以清除数据。
我所有的文本框都有前缀“TextBox”,它在一串6个字符之前,即(TextBox3N1W09,TextBox3N1W10 ...)。我想我想使用 VisualTreeHelper,但我不够聪明:
#1)传入一个变量。我想我了解父级,

XAML < 网格名称="ThisGrid" >

在我的情况下,我将网格命名为:“ThisGrid”,但我不明白如何传入文本框,我不知道是否需要通过文本框的名称进行迭代并将它们作为字符串传递,或者我是否需要可以简单地让 VisualTreeHelper 查看网格中的所有文本框。
#2)一旦传入这些文本框名称或文本框对象,我不确定如何处理结果:

{
将孩子返回为 T;
}

我完全不知道“T”是什么,我该怎么处理“T”?我需要在方法中做某事还是从我调用该方法的地方做某事。就像我一开始说的,我只想清除文本框,这似乎并不难,但我玩得很开心。

public static T FindVisualChildByName<T>(DependencyObject parent, string name) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        string controlName = child.GetValue(Control.NameProperty) as string;
        if (controlName == name)
        {
            return child as T;
        }
        else
        {
            T result = FindVisualChildByName<T>(child, name);
            if (result != null)
                return result;
        }
    }
    return null;
}
4

1 回答 1

1

我正在尝试遍历 WPF 表单上的 TextBoxes 以清除数据

这是错误的方法开始。在 WPF 中,Visual 树是一个复杂的东西,并且通过它导航也可能很复杂。相反,你应该改变你的心态:

  • WPF 最适合使用 MVVM 模式,它鼓励将应用程序逻辑和数据与表示层分离。我建议您研究这种模式,否则您会发现自己一遍又一遍地尝试在 WPF 中做“看似简单”的事情(例如清除文本框)。

  • 你必须学会​​把 UI 看作不是存储数据的地方,而是一种显示数据的方式。因此,您实际要清除的字符串不是任何 UI 元素的属性,而是它们是ModelViewModel的一部分。我建议您阅读有关 WPF 中的 MVVM 和 DataBinding 的信息。

  • 此外,您将 TextBoxes 命名为 TextBox3N1W09、TextBox3N1W10 等的事实让我认为您必须展示数据项的集合(这就是 MVVM 思维方式发挥作用),因此您最好使用其中一个或一个来执行此操作它的衍生物,和一个适当的. 我建议你也阅读这个概念。ItemsControlDataTemplate

底线是,由于 Visual Tree 的复杂性以及诸如 Dispatcher 线程关联等其他因素,WPF 很快不鼓励对 UI 元素的操作。乍一看可能看起来很复杂,但您很快就会意识到应用正确的模式将简化你的生活。

这里有一些你可以开始阅读的文章:

http://en.wikipedia.org/wiki/Model_View_ViewModel

http://msdn.microsoft.com/en-us/library/ms750612.aspx

http://www.wpftutorial.net/

于 2013-01-19T04:06:54.723 回答