我有這段代碼(不起作用),它接受網格型別的網格串列和標簽型別的標簽串列。這將嘗試查找標簽是否存在,然后更改其屬性。
錯誤:NullReferenceException
try
{
var label = (Label)gridlist[i].FindName(labellist[i].Name);
label.Content = (ipaccuracy[i, 0] == true ? @"? " : "") toreturn;
label.ToolTip = string.Join(Environment.NewLine, tooltip);
}
catch (Exception ex)
{
Debug.WriteLine(ex);
}
這段代碼通過 Task.Run() 運行,是動態 UI 的一部分。當 UI 更改時,運行到此代碼的引數(gridlist 和 labellist)會更改,但我希望它出錯,而不是更改 UI 的錯誤部分。
我目前的解決方法是:
labellist[i].Content = (ipaccuracy[i, 0] == true ? @"? " : "") toreturn;
labellist[i].ToolTip = string.Join(Environment.NewLine, tooltip);
但這允許 UI 在呼叫 Task.Run() 以更新每行的正確資訊之前的幾秒鐘內提供不正確的資訊。(當 UI 發生變化時,等待資訊加載時默認文本為“正在加載”)
以下是我如何創建相關 UI 的代碼:
RowDefinition newrow2 = new RowDefinition();
newrow2.Name = "column2_" gamename.CleanName() ip.CleanName();
Debug.WriteLine(newrow2.Name);
newrow2.Height = new GridLength(28);
rows2.Add(newrow2);
game_details_right.RowDefinitions.Add(newrow2);
var g2 = new Grid { Name = "column2_" gamename.CleanName() ip.CleanName() "_grid", };
active_gridlist.Add(g2);
var l2 = new Label
{
Name = "column2_" gamename.CleanName() ip.CleanName() "_text",
Content = "Loading",
};
Debug.WriteLine("column2_" gamename.CleanName() ip.CleanName() "_text");
listlabelsping.Add(l2);
g2.Children.Add(l2);
game_details_right.Children.Add(g2);
Grid.SetRow(g2, s 1);
s ;
Task.Run(() =>
{
UpdatePingRead(active_iplist, active_ipaccuracy, listlabelsping, active_gridlist.ToArray());
});
根據我對代碼的意圖,這里是控制元件的層次結構。
<Grid Name="game_details_right">
<Grid.RowDefinitions>
<RowDefinition Name="column2_game_19216800" Height="*"/>
...
<Grid.RowDefinitions/>
<Grid Grid.Row="0" Name="column2_game_19216800_grid">
<Label Name="column2_game_19216800_text" Content="thing"/>
</Grid>
...
</Grid>
我對 FindName 做錯了什么?我已經確認我使用了正確的名稱,而不是使用標簽串列,而是將相同的引數從建構式傳遞給任務。
代碼說明:我有一個 IP 地址串列,我每 X 秒 ping 一次。該串列會根據用戶想要查看的內容而變化。ping 服務器不會將結果提供給用戶是一種浪費。每次用戶更改組合框中的選擇時,串列都會更新。pinger 在 Task.Run() 中運行,因此它在等待服務器反饋時不會占用 UI。這具有確保始終以設定的間隔嘗試 ping 并保持具有時間增量的任何數學方程相對準確的額外好處。
錯誤代碼的鏈接。 固定(和更清潔)代碼的鏈接。
uj5u.com熱心網友回復:
這里的主要問題是 FindName() 只搜索控制元件的注冊名稱。XAML 硬編碼控制元件應該自動設定(如果您命名它們)。但是,以編程方式創建的控制元件需要使用RegisterName(name, object)進行注冊。
我在建構式的末尾添加了這個,然后忽略了 NullReferenceException 斷點。
RegisterName(l2.Name,l2);
RegisterName(g2.Name,g2);
RegisterName(newrow2.Name,newrow2);
這解決了我的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/458841.html
上一篇:WPFScrollViewer Grid和VisualTreeHelper.GetChildrenCount()
