wpf中对网格内元素的引用

wpf中对网格内元素的引用,wpf,vb.net,Wpf,Vb.net,我有一个函数可以查询数据库中的字符串(在我的应用程序中是x:Name=”“) 代码如下: Try For Each s In output Dim nameOfControl = s Dim window = Windows.Application.Current.Windows(0) Dim visuals = GetVisualChildren(Of FrameworkE

我有一个函数可以查询数据库中的字符串(在我的应用程序中是x:Name=”“)

代码如下:

 Try
            For Each s In output
                Dim nameOfControl = s
                Dim window = Windows.Application.Current.Windows(0)
                Dim visuals = GetVisualChildren(Of FrameworkElement)(window)
                Dim child = visuals.OfType(Of FrameworkElement)().FirstOrDefault(Function(x) x.Name = nameOfControl)
                child.Visibility = Visibility.Collapsed
            Next


 Public Iterator Function GetVisualChildren(Of T As Visual)(parent As DependencyObject) As IEnumerable(Of T)
    Dim child As T = Nothing
    Dim numVisuals As Integer = VisualTreeHelper.GetChildrenCount(parent)
    For i As Integer = 0 To numVisuals - 1
        Dim v As Visual = DirectCast(VisualTreeHelper.GetChild(parent, i), Visual)
        child = TryCast(v, T)
        If v IsNot Nothing Then
            For Each item In GetVisualChildren(Of T)(v)
                Yield item
            Next
        End If
        If child IsNot Nothing Then
            Yield child
        End If
    Next
End Function
我似乎无法理解为什么这不适用于所有元素,即我的窗口包含一个
选项卡控件
,我可以用“x名称”来调用它,
工具栏
,即使使用
选项卡项
,一切都可以正常工作,但我无法参考
您的问题在于:

Dim child = visuals.OfType(Of FrameworkElement)().FirstOrDefault(Function(x) x.Name = nameOfControl)
如果谓词导致
False
,则
FirstOrDefault
方法将返回
Nothing
。在您的情况下,之所以这样做是因为在下一行,
child
为空,因此NRE:

child.Visibility = Visibility.Collapsed
您不能将
可见性
属性指定给
子项
,因为它是

谓词是
Function(x)x.Name=nameOfControl
,因此
visuals.OfType(FrameworkElement的)(
Name
属性等于
nameOfControl
的集合中不能有值

为了解决这个问题,您需要调试它,看看到底发生了什么。我将把你的陈述分成两行:

Dim child = visuals.OfType(Of FrameworkElement)()
Dim match = child.FirstOrDefault(Function(x) x.Name = nameOfControl)
在第二行上放置一个断点,使其在该语句运行之前中断。然后查看本地/自动窗口(假设为VisualStudio),并查看集合中的实际内容

这里还要注意的另一件事是:当您将
x.Name
nameOfControl
用等号
=/code>进行比较时,它是以区分大小写的方式进行的,因此如果您有
MyName
MyName
,这两个值是不相等的。如果希望以不区分大小写的方式进行比较,则可以使用此选项:

Function(x) x.Name.Equals(nameOfControl, StringComparison.CurrentCultureIgnoreCase)

那么,在这种情况下我能做些什么吗?很抱歉,匹配会为所有选项卡
{System.Windows.Controls.TabItem Header:Tab Two Content:}
选项卡二或选项卡三返回一个值。但对于控件“刷新按钮”的名称,我并没有得到匹配项