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


经排查,问题出在Loaded里面,原始代码
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);
}
把
HisItems = new ObservableCollection<HisItem>(hisItems);
放入 BeginInvoke 后任务栏图标正常显示
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); 无法正常显示任务栏图标
Application.Current.Dispatcher?.BeginInvoke(() =>
{
HisItems = new ObservableCollection<HisItem>(hisItems);
});
}
或者
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 的核心手段之一。
当然后面了解到prism 还有 AsyncDelegateCommand,效果一样的。

浙公网安备 33010602011771号