WPF中Grid内Label获取为null问题排查求助
Hey there, let's break down why you're hitting this null Label issue and fix it up quickly!
The Core Problem: You Never Set the Label's Name Property
Looking at your code, when you create the Label instance:
Label label = new Label(); label.Content = Books[i].Titel;
You don't set its Name property to "label"! So when you try to find it with:
Label lbl = grid.Children.OfType<Label>().FirstOrDefault(k => k.Name == "label");
There's no Label in the collection with that name, hence it returns null.
Bonus Fix: Avoid the Closure Trap in Your Loop
Another thing to watch out for: since you're using a lambda inside a loop, referencing the loop variable or the grid/label variables directly can lead to unexpected behavior (you might end up referencing the last iteration's values). To fix this, capture a local copy of the label inside the loop.
Revised Code
Here's the updated version of your loop that fixes both issues:
for (int i = 0; i < numberOfBooks; i++) { Grid grid = new Grid(); RowDefinition row = new RowDefinition(); ColumnDefinition column = new ColumnDefinition(); ColumnDefinition column2 = new ColumnDefinition(); ColumnDefinition column3 = new ColumnDefinition(); // 1. Set the Name property (matches your lookup condition) Label label = new Label { Content = Books[i].Titel, Name = "label" }; downGrid.RowDefinitions.Add(row); grid.ColumnDefinitions.Add(column); grid.ColumnDefinitions.Add(column2); grid.ColumnDefinitions.Add(column3); Grid.SetRow(label, i); Grid.SetColumn(label, 0); Grid.SetRow(grid, i); upperGrid.Children.Add(grid); grid.Children.Add(label); // 2. Capture a local copy of the label to avoid closure issues Label localLabel = label; grid.MouseLeftButtonDown += (sen, evg) => { // Option 1: Use the captured localLabel directly (cleanest approach!) string result = localLabel?.Name; Console.WriteLine(result); // Option 2: If you still want to look it up by name (now works because we set Name) // Label lbl = grid.Children.OfType<Label>().FirstOrDefault(k => k.Name == "label"); // string result = lbl?.Name; // Console.WriteLine(result); }; }
About the Private _visualChildren You Saw in Debug
That internal _visualChildren collection is part of WPF's internal implementation—you should never try to access private members like that in production code. The public Children collection is the correct, supported way to access elements added to the Grid, and our fix ensures your Label is properly accessible through it.
内容的提问来源于stack exchange,提问作者Siegfried XVI

