2017-03-06 4 views
0

Ich habe eine Funktion, die die Datenbank für Strings querys (die x sind: Name = "" in meiner Anwendung)Verweis auf ein Element in einem Raster in wpf

Nach dem Code:

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 

Ich kann nicht herausfinden, warum dies nicht für alle Elemente funktioniert, dh. Mein Fenster besteht aus einer TabControl die ich anrufen kann mit "x name", das gleiche gilt für toolBar, alles funktioniert auch mit TabItem's gut, aber ich kann nicht auf <Button x:Name="buttonRefresh" beziehen, die in einem der TabItem's Grids ist.

erhalte ich einen Fehler Nullreferenceexception auf der Linie unten:

child.Visibility = Visibility.Collapsed

Wenn ich einen Haltepunkt an dieser Zeile einzufügen bekomme ich diese {System.Windows.Controls.TabItem Header:FirstTab Content:} für child also bin ich asuming ich muss etwas über dieses Stück Code ändern

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

Antwort

1

Ihr Problem ist hier:

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

Die FirstOrDefault Methode Nothing wenn das Prädikat Ergebnisse in False zurück. In Ihrem Fall ist es so, weil in der nächsten Zeile getan, child ist null, daher der NRE:

child.Visibility = Visibility.Collapsed 

Sie nicht auf die Visibility Eigenschaft auf child zuweisen können, weil es Nothing ist.

Ihr Prädikat ist Function(x) x.Name = nameOfControl, daher darf in der von visuals.OfType(Of FrameworkElement)() zurückgegebenen Sammlung kein Wert enthalten sein, dessen Name -Eigenschaft nameOfControl entspricht.

Um dies zu beheben, müssen Sie es debuggen und sehen, was wirklich vor sich geht. Ich würde Ihre Aussage in zwei Linien brechen:

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

Setzen Sie einen Haltepunkt in der zweiten Zeile, so bricht es vor, dass Anweisung ausgeführt wird. Dann schau in dein Locals/Autos-Fenster (unter der Annahme von Visual Studio) und sieh nach, was sich tatsächlich in der Sammlung befindet.

Eine andere Sache, hier zu beachten: Wenn Sie x.Name zu nameOfControl vergleichen mit dem Gleichheits = unterzeichnen, tut sie dies in Groß- und Kleinschreibung Weise, wenn Sie also MyName und myname haben, diese beiden sind nicht gleich. Sie können dies stattdessen verwenden, wenn Sie möchten, dass es ohne Berücksichtigung der Groß- und Kleinschreibung verglichen wird:

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

Also, kann ich in diesem Fall etwas tun? – Thomas

+0

Siehe meine Updates. Viel Glück. –

+0

Es tut mir leid, die Übereinstimmung gibt einen Wert für alle Registerkarten {System.Windows.Controls.TabItem Header: Tab Zwei Inhalte:} '** Tab Zwei oder Tab Drei **. Aber für nameOfControl "refreshButton" bekomme ich nichts in ** match ** – Thomas

Verwandte Themen