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,效果一样的。

posted @ 2026-10-19 15:06  重生之我是大彩笔  阅读(5)  评论(0)    收藏  举报