我有一个TextBlock我添加了内联,其中一些是图像。这适用于Twitter应用程序,因此图像是表情符号。
我现在遇到一个奇怪的问题,即没有显示表情符号图像,但是另一个表情符号旁边的另一个表情符号工作得很好。在附带的屏幕截图中,我使用Snoop查看WPF结构,据我所知,所有内联图像的内容都相同。 (如果他们不是,我会感到惊讶,因为他们都以同样的方式被放入TextBlock)。。
图像源指向实际上does exist的图像,那么当其他表情符号显示得很好时,为什么不显示?
有没有人知道什么会导致这个奇怪的问题?
为了完成,这是一个有点伪代码,它将带有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,则没有区别。
显然,对于可以使用多少单独的图像似乎存在某种限制。那么这个限制怎么能被扩展,甚至被忽略呢?
答案 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中可能导致主要问题的任何连接限制有更多了解,请随时留下评论或答案如何扩展它。