wpf中对网格内元素的引用
我有一个函数可以查询数据库中的字符串(在我的应用程序中是x:Name=”“) 代码如下: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
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:}
选项卡二或选项卡三返回一个值。但对于控件“刷新按钮”的名称,我并没有得到匹配项