bug-wpf程序任务栏图标无法正常显示

  • ~1.80K 字

不久前遇到个问题,明明为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();
//HisItems = new ObservableCollection<HisItem>(hisItems); 无法正常显示任务栏图标
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 的核心手段之一