SecondaryTile.DisplayName创建时可更新 后续实例化更新失效问题咨询
问题原因
- 直接调用
new SecondaryTile(id)构造得到的实例仅填充了TileId属性,不会自动加载该磁贴在系统中存储的完整元数据(包括原有Arguments、磁贴Logo、显示配置等必填属性) SecondaryTile.UpdateAsync()执行时要求实例包含磁贴的全部必填元数据,缺失情况下系统会默认跳过DisplayName属性的变更校验,所以更新不生效- 磁贴视觉效果更新走的是
TileUpdateManager相关API,仅依赖TileId即可定位目标磁贴,无需完整SecondaryTile实例,所以不受该问题影响
解决方案
方案1:先拉取系统存储的完整磁贴实例(更稳妥,无需提前存储磁贴其他属性)
async Task UpdateTileDisplayName(string tileId, string newDisplayName) { // 拉取当前应用所有已固定的SecondaryTile var allTiles = await SecondaryTile.FindAllAsync(); // 匹配对应Id的磁贴,此时拿到的实例包含所有完整元数据 var targetTile = allTiles.FirstOrDefault(t => t.TileId == tileId); if (targetTile == null) return; targetTile.DisplayName = newDisplayName; await targetTile.UpdateAsync(); }
方案2:手动填充所有必填属性后更新(适合本地已存储磁贴其他必填属性的场景)
async Task UpdateTileDisplayName(string tileId, string newDisplayName, string arguments, Uri square150x150Logo) { // 构造实例后手动补充所有创建磁贴时的必填属性 var targetTile = new SecondaryTile(tileId); targetTile.Arguments = arguments; // 和创建磁贴时的Arguments保持一致即可 targetTile.DisplayName = newDisplayName; targetTile.VisualElements.Square150x150Logo = square150x150Logo; // 和创建磁贴时的Logo保持一致 // 其他创建时设置过的属性都要重新赋值,比如显示大小、是否显示名称等 targetTile.VisualElements.ShowNameOnSquare150x150Logo = true; await targetTile.UpdateAsync(); }
内容的提问来源于stack exchange,提问作者ispiro
相关产品推荐
相关产品推荐

