2017-07-06 45 views
-1

我有一個TextBlock,我添加了內聯,其中一些是圖像。這是一個Twitter應用程序,所以圖像是表情符號。圖像未顯示在TextBlock中

我現在遇到了一個奇怪的問題,其中沒有顯示錶情符號圖像,但是右側旁邊的另一個表情符號工作得很好。在附加的屏幕截圖中,我使用Snoop來查看WPF結構,並且據我所知,所有內嵌圖像的所有內容都是相同的。 (如果他們不是,我會感到驚訝,因爲它們都以相同的方式放入TextBlock中)

圖像源指向一個圖像,實際上does exist,所以爲什麼不顯示時,其他表情符號顯示就好了?

有沒有人有任何想法可以導致這個奇怪的問題?

enter image description here

完成,這是使用表情符號返回文本的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自己的emojis或Twemoji的CDN,則沒有區別。

顯然似乎有某種限制,可以使用多少個獨立的圖像。那麼這個限制怎麼能被延長甚至被忽略呢?

+0

愚蠢的問題:也許你看到圖像的左上角?例如,如果將「Stretch」設置爲「None」並將「Image」的「Width」和「Height」設置爲10,則會發生這種情況。這張圖片的大小是72x72。同一個「TextBlock」中的其他圖像大小是多少? – Maxim

+0

@Maxim所有圖像都使用72x72來源,所以它應該與其他正在工作的圖像相同。 – GTHvidsten

+0

你能提供最少的代碼來重現這個問題嗎?我的意思是真實的代碼,而不是僞代碼。 – Maxim

回答

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中可能導致主要問題的任何連接限制,請隨時留下評論或回答如何擴展它。

+0

我甚至不確定WPF方面的限制......它可能是服務器保護自己免受可能的DOS攻擊,何時涉及多個連接。 – grek40

+0

@ grek40我確實懷疑服務器可能是這個問題,但是奇怪的是隻有一個特殊的表情符號。此外,在twitter.com上顯示許多推文時,網絡瀏覽器似乎沒有這個問題,所以我仍然不確定它是否只是保護自己的服務器,儘管它可能是一個促成因素。 – GTHvidsten

+0

Web瀏覽器很可能使用相同的連接/會話進行多個請求。實際上,當我看到每次創建一個新的'WebClient'實例時,我都有點驚訝,而不是下載所有具有相同實例的表情符號。 – grek40