TextBlock

时间:2017-07-06 18:50:00

标签: c# wpf xaml

我有一个TextBlock我添加了内联,其中一些是图像。这适用于Twitter应用程序,因此图像是表情符号。

我现在遇到一个奇怪的问题,即没有显示表情符号图像,但是另一个表情符号旁边的另一个表情符号工作得很好。在附带的屏幕截图中,我使用Snoop查看WPF结构,据我所知,所有内联图像的内容都相同。 (如果他们不是,我会感到惊讶,因为他们都以同样的方式被放入TextBlock)。

图像源指向实际上does exist的图像,那么当其他表情符号显示得很好时,为什么不显示?

有没有人知道什么会导致这个奇怪的问题?

enter image description here

为了完成,这是一个有点伪代码,它将带有emojis的文本作为Inline的列表返回:

List<Inline> inlines =  new List<Inline>();

foreach (Match match in Regex.Matches(text, emojiPattern)) {
    Uri src = new Uri("URL_TO_EMOJI");
    InlineUIContainer cont = new InlineUIContainer(new Image {
        Source = new BitmapImage(src)
    });
    inlines.Add(cont);
}

return inlines;

更新

这似乎是许多连接的问题。我的Twitter应用程序显示各种列表。如果我将用户放在单独列表中的屏幕截图中,那么我只显示该列表,则显示所有表情符号。如果我同时显示许多其他列表和用户,则会再次出现表情符号问题。

如果我使用Twitters自己的表情符号或者用于Twemoji的CDN,则没有区别。

显然,对于可以使用多少单独的图像似乎存在某种限制。那么这个限制怎么能被扩展,甚至被忽略呢?

1 个答案:

答案 0 :(得分:1)

我从来没有发现连接限制,所以我最终自己下载了这些图像,并将它们缓存,以便我不会多次下载相同的表情符号:

private readonly Dictionary<string, BitmapImage> EmojiCache = new Dictionary<string, BitmapImage>();

private BitmapImage GetEmoji(string emojiCode) {
    if (EmojiCache.ContainsKey(emojiCode)) {
        return EmojiCache[emojiCode];
    }

    WebClient client = new WebClient();
    byte[] emojiBytes = client.DownloadData($"https://twemoji.maxcdn.com/2/72x72/{emojiCode}.png");
    BitmapImage emojiImg = new BitmapImage();
    using (MemoryStream ms = new MemoryStream(emojiBytes)) {
        ms.Position = 0;
        emojiImg.BeginInit();
        emojiImg.CreateOptions = BitmapCreateOptions.PreservePixelFormat;
        emojiImg.CacheOption = BitmapCacheOption.OnLoad;
        emojiImg.UriSource = null;
        emojiImg.StreamSource = ms;
        emojiImg.EndInit();
    }

    EmojiCache.Add(emojiCode, emojiImg);

    return emojiImg;
}

如果有人对WPF中可能导致主要问题的任何连接限制有更多了解,请随时留下评论或答案如何扩展它。