如何修改ClickOnce WPF C#应用的更新提示框并添加详情?
自定义ClickOnce更新提示的可行方案
当然可以替换默认的ClickOnce更新提示!默认的提示确实太简洁了,没法传递版本细节和更新说明,不过我们可以通过禁用默认更新检查+手动实现更新逻辑的方式,完全自定义提示内容。下面是具体步骤:
第一步:关闭默认的自动更新检查
首先得把ClickOnce自带的自动检查给关掉,避免和我们的自定义逻辑冲突:
- 打开你的WPF项目属性,切换到「发布」选项卡
- 点击「更新」按钮,取消勾选「应用程序启动时检查更新」
- 保存设置,这样默认的提示就不会再弹出来了
第二步:手动实现更新检查逻辑
我们需要用System.Deployment.Application命名空间下的API来手动检查更新,这个API只有在ClickOnce部署的应用中才能正常工作,所以记得先做判断。
核心代码示例
using System.Deployment.Application; using System.Windows; private async void CheckForUpdatesManually() { // 先判断是否是ClickOnce部署的应用 if (!ApplicationDeployment.IsNetworkDeployed) { MessageBox.Show("此应用未通过ClickOnce部署,无法检查更新。"); return; } try { var deployment = ApplicationDeployment.CurrentDeployment; // 异步检查更新,避免阻塞UI var updateInfo = await deployment.CheckForUpdateAsync(); if (updateInfo.UpdateAvailable) { // 获取版本对比信息 var newVersion = updateInfo.AvailableVersion.ToString(); var currentVersion = deployment.CurrentVersion.ToString(); // 加载更新说明(这里可以替换成你自己的获取逻辑) var releaseNotes = await GetReleaseNotesAsync(newVersion); // 弹出自定义更新提示窗口 var updateWindow = new UpdatePromptWindow( currentVersion, newVersion, releaseNotes ); if (updateWindow.ShowDialog() == true) { // 用户确认更新,开始下载并安装 await deployment.UpdateAsync(); MessageBox.Show("更新已完成,请重启应用。"); Application.Current.Shutdown(); } } else { MessageBox.Show("当前已是最新版本。"); } } catch (DeploymentDownloadException ex) { MessageBox.Show($"更新检查失败:{ex.Message}"); } catch (InvalidDeploymentException) { MessageBox.Show("部署信息无效,无法检查更新。"); } }
第三步:获取自定义更新说明的几种方式
要在提示里显示更新缘由、版本细节,你需要把这些信息和新版本一起发布,这里提供两种常用方法:
方法1:发布独立的更新说明文件
- 在你的项目中添加一个
ReleaseNotes_{版本号}.txt(比如ReleaseNotes_1.2.0.txt),或者统一用LatestReleaseNotes.txt每次发布时覆盖 - 设置文件的「复制到输出目录」为「始终复制」,并在发布选项卡中确保这个文件被包含在发布内容里
- 然后通过下面的方法读取文件内容:
private async Task<string> GetReleaseNotesAsync(string newVersion) { var deployment = ApplicationDeployment.CurrentDeployment; // 指向发布服务器上的更新说明文件路径(和应用部署包同目录) var notesUrl = new Uri($"{deployment.UpdateLocation.AbsoluteUri}ReleaseNotes_{newVersion}.txt"); using var client = new HttpClient(); var notesContent = await client.GetStringAsync(notesUrl); return notesContent; }
方法2:在应用清单中嵌入更新信息
- 打开项目的
app.manifest文件,在<assembly>节点下添加自定义元数据:
<assembly ...> <assemblyIdentity ... /> <!-- 自定义更新信息 --> <customAttributes xmlns="urn:schemas-microsoft-com:asm.v3"> <customAttribute> <attributeName>ReleaseNotes</attributeName> <attributeValue>1.2.0版本更新内容: - 修复了导出功能的Bug - 新增了用户偏好设置 - 优化了界面加载速度</attributeValue> </customAttribute> </customAttributes> </assembly>
- 然后通过代码读取这个元数据:
private string GetReleaseNotesFromManifest() { var deployment = ApplicationDeployment.CurrentDeployment; var manifest = deployment.GetManifestAsync().Result; var customAttributes = manifest.Assembly.Cast<object>() .OfType<CustomAttribute>() .FirstOrDefault(ca => ca.Name == "ReleaseNotes"); return customAttributes?.Value ?? "暂无更新说明"; }
第四步:创建自定义更新提示窗口
你可以用WPF设计一个和应用风格一致的窗口,包含以下元素:
- 当前版本和新版本号的对比展示
- 滚动显示的更新说明文本框
-「立即更新」和「稍后提醒」按钮
这样用户就能清晰看到更新的所有细节,再决定是否更新。
注意事项
- 记得在项目中引用
System.Deployment程序集,否则无法使用ApplicationDeployment类 - 处理好网络异常情况,比如用户离线时的友好提示
- 如果你的应用需要后台静默检查更新,可以把检查逻辑放在应用启动后的后台线程里,不要阻塞UI
内容的提问来源于stack exchange,提问作者NirMH
相关产品推荐
相关产品推荐

