在 DisplayName 中具有 unicode 字符的 SecondaryTile

SecondaryTile with unicode character in DisplayName

我正在使用这段代码创建一个 SecondaryTile

    public static async Task<bool> PinToStartAsync(Playlist playlist, bool isPlaylist)
    {
        var tilename = playlist.Name;
        var tileid = Uri.EscapeDataString(isPlaylist ? tilename : $"{tilename}+++{playlist.Artist}");
        var filename = Uri.EscapeDataString(tilename);
        var path = LogoPath;
        if (playlist.DisplayItem.Source != null && await (await GetSecondaryTileFolder()).TryGetItemAsync(filename) == null)
        {
            await (await GetStorageItemThumbnailAsync(playlist.DisplayItem.Source.Path)).SaveAsync(SecondaryTileFolder, filename);
            path = $"ms-appdata:///local/SecondaryTiles/{filename}.png";
        }
        var tile = new SecondaryTile(tileid, tilename, isPlaylist.ToString(), new Uri(path), TileSize.Default);
        tile.VisualElements.ShowNameOnSquare150x150Logo = tile.VisualElements.ShowNameOnSquare310x310Logo = tile.VisualElements.ShowNameOnWide310x150Logo = true;
        if (SecondaryTile.Exists(tilename)) await tile.RequestDeleteAsync();
        else await tile.RequestCreateAsync();
        return SecondaryTile.Exists(tilename);
    }

当播放列表名称为 123 或 helloworld 时,这段代码工作正常。但是,当我在 tilename 中使用 unicode 时,它​​会导致问题。

下面是我创建的 SecondaryTile 的图像。前两个名字有一些unicode字符。

所以它无法显示我存储在本地的 Thumbnail,即使我成功创建了这些图像。

unicode 字符的另一个问题是,SecondaryTile.Exists(tilename) 总是 return false。

我注意到 unicode 的问题,所以我将 Uri.EscapeDataString 添加到 tileidfilename 以便它们是 uri 安全的。但是,我确实希望我的图块具有带有 unicode 字符的名称。

我应该如何在 tilename 中允许使用 unicode 字符?

---代码更新---

    public static async Task<bool> PinToStartAsync(Playlist playlist, bool isPlaylist)
    {
        var tilename = playlist.Name;
        var tileid = WebUtility.UrlEncode(isPlaylist ? tilename : $"{tilename}+++{playlist.Artist}");
        var filename = tileid + ".png";
        var path = DefaultAlbumCoverPath;
        if (playlist.DisplayItem.Source != null && !await (await GetSecondaryTileFolder()).Contains(filename))
        {
            await (await GetStorageItemThumbnailAsync(playlist.DisplayItem.Source.Path)).SaveAsync(SecondaryTileFolder, tileid);
            path = $"ms-appdata:///local/SecondaryTiles/" + filename;
        }
        var tile = new SecondaryTile(tileid, tilename, isPlaylist.ToString(), new Uri(path), TileSize.Default);
        tile.VisualElements.ShowNameOnSquare150x150Logo = tile.VisualElements.ShowNameOnSquare310x310Logo = tile.VisualElements.ShowNameOnWide310x150Logo = true;
        if (SecondaryTile.Exists(tileid)) await tile.RequestDeleteAsync();
        else await tile.RequestCreateAsync();
        return SecondaryTile.Exists(tileid);
    }

由于SecondaryTile是通过路径访问图片,所以整个URI必须是路径安全的,这是软件成功访问图片的前提。

从这个角度看,你的处理没有任何问题。

事实上,这些图像存储在应用程序的本地存储中,并不公开。这个名字不需要关心。 但是你可以在导出这些图片时通过`Uri.UnescapeDataString()` 翻译图片名称或者你想得到它的名字。

更新

从你给的图片可以看出,tile可以显示中文文字(虽然看不清,因为是白底+白字),所以你的问题出现在图片上

您不必使用Uri.EscapeDataString更改文件名,这在转换长文件名时会超过限制。

您可以将图片保存为原名,但在使用link时可以使用以下方法:

string imagePath = $"ms-appdata:///local/SecondaryTiles/{WebUtility.UrlEncode("测试图片")}.png";

在link中使用WebUtility.UrlEncode()可以很好的解决这个问题,图像也能正常识别。

Another problem with unicode character is that, the SecondaryTile.Exists(tilename) will always return false.

这与 Unicode 无关,主要问题在于您的代码:

if (SecondaryTile.Exists(tilename)) 
    await tile.RequestDeleteAsync();
else 
    await tile.RequestCreateAsync();

你的代码有一个关键问题。当它检测到相同id的Tile时,只是删除它,并没有创建新的Tile,所以检测到时自然returns false。

此致。