在wpf

时间:2017-03-06 17:50:10

标签: 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 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,我可以通过&#34; x名称&#34;来调用,同样适用于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)

1 个答案:

答案 0 :(得分:1)

你的问题在这里:

Dim child = visuals.OfType(Of FrameworkElement)().FirstOrDefault(Function(x) x.Name = nameOfControl)

如果谓词导致FirstOrDefaultNothing方法将返回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