在 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
添加到 tileid
和 filename
以便它们是 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。
此致。
我正在使用这段代码创建一个 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
添加到 tileid
和 filename
以便它们是 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必须是路径安全的,这是软件成功访问图片的前提。
从这个角度看,你的处理没有任何问题。
更新
从你给的图片可以看出,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。
此致。