2017-03-06 47 views
0

我有querys絃樂數據庫的功能(這是X:NAME =「」在我的應用程序)參考的元素一個網格內的WPF

以下是代碼:

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,一切仍然正常,但我不能參考網格中的<Button x:Name="buttonRefresh"

我收到上線波紋管一個錯誤的NullReferenceException:

child.Visibility = Visibility.Collapsed

如果我插入在該行斷點我得到這個{System.Windows.Controls.TabItem Header:FirstTab Content:}child所以我假設我需要改變這段代碼

Dim window = Windows.Application.Current.Windows(0)

回答

1

你的問題是在這裏:

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

FirstOrDefault方法將在False如果斷言結果返回Nothing。在你的情況下,它已經因爲下一行這樣做,child爲空,因此NRE:

child.Visibility = Visibility.Collapsed 

您不能分配到Visibility財產上child,因爲它是Nothing

您的謂詞是Function(x) x.Name = nameOfControl,因此visuals.OfType(Of FrameworkElement)()返回的集合中不能有屬性等於nameOfControl的值。

爲了解決這個問題,你需要調試它,看看到底發生了什麼。我會打破你的發言分爲兩線:

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

把一個破發點,第二行,因此打破了語句運行之前。然後查看您的本地/自動窗口(假設Visual Studio),並查看集合中的實際內容。其他

有一點要注意這裏:當你比較x.NamenameOfControl用等號=,但是這樣做的區分大小寫方式,所以如果你有MyNamemyname,這兩個是不等於。如果您希望以大小寫不敏感的方式進行比較,您可以使用它:

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

那麼,在這種情況下我能做些什麼嗎? – Thomas

+0

查看我的更新。祝你好運。 –

+0

對不起,該匹配返回所有標籤'{System.Windows.Controls。TabItem標題:標籤二內容:} ** **標籤二或標籤三**。但是對於nameOfControl「refreshButton」,我在** match **中沒有得到任何東西 – Thomas