不久前遇到个问题,明明为wpf程序设置了图标,但就是不正常显示。


经排查,问题出在Loaded里面,原始代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| LoadedCommand = new DelegateCommand(OnLoaded);
private async void OnLoaded() { using AppDbContext db = new(); var hisItems = await db.UploadHistorys.Select(i => new HisItem { Url = i.Url, FileName = i.FileName, UploadTime = i.UploadTime, FileSize = i.FileSize }).OrderByDescending(h => h.UploadTime).Take(100).ToListAsync(); HisItems = new ObservableCollection<HisItem>(hisItems); }
|
把
1
| HisItems = new ObservableCollection<HisItem>(hisItems);
|
放入 BeginInvoke 后任务栏图标正常显示
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| LoadedCommand = new DelegateCommand(OnLoaded);
private async void OnLoaded() { using AppDbContext db = new(); var hisItems = await db.UploadHistorys.Select(i => new HisItem { Url = i.Url, FileName = i.FileName, UploadTime = i.UploadTime, FileSize = i.FileSize }).OrderByDescending(h => h.UploadTime).Take(100).ToListAsync(); Application.Current.Dispatcher?.BeginInvoke(() => { HisItems = new ObservableCollection<HisItem>(hisItems); }); }
|
或者
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| public async void OnLoaded() { var hisItems = await Task.Run(async () => { using AppDbContext db = new(); return await db.UploadHistorys.Select(i => new HisItem { Url = i.Url, FileName = i.FileName, UploadTime = i.UploadTime, FileSize = i.FileSize }).OrderByDescending(h => h.UploadTime).Take(100).ToListAsync(); }); HisItems = new ObservableCollection<HisItem>(hisItems); }
|
这里的Dispatcher?.BeginInvoke,用于从非 UI 线程异步地向 UI 线程(Dispatcher 所在的线程)投递一个操作。它是 WPF 跨线程更新 UI 的核心手段之一