SecondaryTile с символом Юникода в DisplayName - PullRequest
0 голосов
/ 29 октября 2019

Я использую этот фрагмент кода для создания 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. Однако, когда я использую Unicode в tilename, это вызывает проблемы.

Ниже приведено изображение SecondaryTile s, которое я создал. Имя первых двух содержит несколько символов Юникода.

enter image description here

Таким образом, невозможно отобразить Thumbnail, сохраненный локально, даже если я создалэти изображения успешно.

enter image description here

Другая проблема с символом Unicode заключается в том, что SecondaryTile.Exists(tilename) всегда будет возвращать false.

У меня естьзаметил проблему с юникодом, поэтому я добавил Uri.EscapeDataString к tileid и filename, чтобы они были безопасны. Однако я хочу, чтобы у моих плиток были имена с символами Unicode.

Как разрешить символы Unicode в tilename?

--- Обновление кода ---

    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);
    }

1 Ответ

1 голос
/ 29 октября 2019

Поскольку SecondaryTile обращается к изображению по пути, весь URI должен быть безопасным для пути, что является обязательным условием для успешного доступа программного обеспечения к изображению.

С этой точки зрения, с вашей обработкой все в порядке.

На самом деле эти изображения хранятся в локальном хранилище приложения и не являются общедоступными. Имя не должно беспокоить. Но вы можете перевести имя изображения с помощью `Uri.UnescapeDataString ()` при экспорте этих изображений или вы хотите получить его имя.

Обновление

Как видно из изображения, которое вы дали, на плитке может отображаться китайский текст (хотя он неразборчив, потому что это белый фон + белыйтекст), поэтому ваш вопрос появляется на изображении.

Вам не нужно использовать Uri.EscapeDataString для изменения имени файла, которое превысит предел при преобразовании длинных имен файлов.

YouМожно сохранить изображение как исходное имя, но вы можете использовать следующие методы при использовании ссылки:

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

Использование WebUtility.UrlEncode() в ссылке может решить эту проблему хорошо, и изображение будет распознано нормально.

Другая проблема с символами Юникода заключается в том, что SecondaryTile.Exists (tilename) всегда будет возвращать значение false.

Это не имеет ничего общего с Юникодом, основной проблемойВаш код:

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

Ваш код имеет ключевую проблему. Когда он обнаруживает плитку с тем же идентификатором, он только удаляет ее, но не создает новую плитку, поэтому, естественно, возвращает ложь, когда обнаруживает.

С наилучшими пожеланиями.

...