我有一个函数可以查询数据库中的字符串(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
我似乎无法弄清楚为什么这对所有元素都不起作用,即。我的窗口包含一个TabControl
,我可以通过" x名称"来调用,同样适用于toolBar
,即使使用TabItem's
,一切也能正常运行,但我无法引用{ {1}}位于<Button x:Name="buttonRefresh"
网格之一。
我在下面的行中收到错误NullReferenceException:
child.Visibility = Visibility.Collapsed
如果我在该行插入一个断点,我会TabItem's
得到{System.Windows.Controls.TabItem Header:FirstTab Content:}
,所以我想知道我需要更改一些关于这段代码的内容
Dim window = Windows.Application.Current.Windows(0)
答案 0 :(得分:1)
你的问题在这里:
Dim child = visuals.OfType(Of FrameworkElement)().FirstOrDefault(Function(x) x.Name = nameOfControl)
如果谓词导致FirstOrDefault
,Nothing
方法将返回False
。在你的情况下,它已经这样做了,因为在下一行,child
为空,因此NRE:
child.Visibility = Visibility.Collapsed
您无法在Visibility
上分配child
属性,因为它是Nothing
。
您的谓词为Function(x) x.Name = nameOfControl
,因此visuals.OfType(Of FrameworkElement)()
属性等于Name
的{{1}}返回的集合中不得有值。
要解决此问题,您需要对其进行调试并查看实际情况。我会将你的陈述分为两行:
nameOfControl
在第二行放置一个断点,使其在该语句运行之前中断。然后查看您的locals / autos窗口(假设Visual Studio),并查看集合中的实际内容。
此处需要注意的另一件事是:当您将Dim child = visuals.OfType(Of FrameworkElement)()
Dim match = child.FirstOrDefault(Function(x) x.Name = nameOfControl)
与x.Name
与等号nameOfControl
进行比较时,它会以区分大小写的方式进行比较,因此如果您有=
和MyName
,则这两个不相等。如果您希望以不区分大小写的方式进行比较,则可以使用它:
myname