2010-06-19 18 views
5

我在使用WPF字形和文檔,並在.Net 4框架中遇到空引用異常。WPF - 將字體保存到磁盤,然後爲字體引發GlyphTypeface引發異常。爲什麼?

我提取並將真實類型的字體保存爲.ttf文件,然後嘗試根據字體創建字形。我第一次將字體保存到磁盤並基於字體實例化一個字形字體後從同一文件夾中的另一種字體創建字形字體我得到一個空引用異常。

說我有字體A和B. B沒有被保存到磁盤(A可能會或不會被保存到磁盤;這似乎並不重要):

1)保存B到磁盤在與A相同的文件夾中,
2)使用字體A創建字形字體,
3)使用字體B =異常創建字形字體。

Null reference exception at: 
at MS.Internal.FontCache.FontFaceLayoutInfo.IntMap.TryGetValue(Int32 key, UInt16& value) 
at MS.Internal.FontCache.FontFaceLayoutInfo..ctor(Font font) 
at System.Windows.Media.GlyphTypeface.Initialize(Uri typefaceSource, StyleSimulations styleSimulations) 
at System.Windows.Media.GlyphTypeface..ctor(Uri typefaceSource) 

如果我重新啓動我的應用程序並再次運行它(字體B已在磁盤上),則步驟3不會引發異常。

的代碼保存字體到磁盤只是從二進制流寫一個部分,讓文件的旅途:

if (!File.Exists(filename)) 
{ 
    using (FileStream fs = File.Create(filename, length)) 
    { 
     fs.Write(m_data, m_index, length); 
     fs.Close(); 
    } 
} 

任何想法?我不想把每個字體放在自己的文件夾中...

感謝您的時間。

回答

2

我最終使用了將每種字體保存到其自己的文件夾(使用字體名稱作爲文件夾名稱)的解決方法。例外情況消失了,所以我想我們可以將這個問題記錄在.Net中的一個錯誤中。

+0

font-per-folder解決方法不適用於我,您是否曾發現有關此問題的更多信息? – Cheetah 2010-08-04 16:57:30

+0

不,對不起。解決方法仍然適用於我。我使用的是.Net 4.0(我認爲它在.Net 3.5 SP1中不是問題,但我不積極)。我在創建文件之前檢查字體是否存在;我懷疑,如果你在自己的文件夾中創建一個字體,然後嘗試刪除/覆蓋它(不重新啓動你的應用程序),它會拋出異常。 – AndrewS 2010-08-05 13:09:03

0

我的解決方法是簡單地用等值<替換<字形> TextBox> s。在我的情況下,佈局中的幾個像素差異不是問題。

就像你提到的是你的情況,在我的情況下,它也不是在.Net 3.5中的問題,但出現在.Net 4.0中。

1

我(和同事)終於找到我們特別的問題是:不要將字體文件保存到%TEMP%。出於某種原因,將字體保存到其他文件夾會使其工作(對我們而言),並將其保存到%TEMP%內部的任何位置會使其中斷。

+0

儘管沒有保存在臨時文件夾中,仍然出現相同的錯誤。 – Triynko 2015-12-17 21:29:52

2

這個bug一直在讓我瘋狂,但我認爲我現在對現在發生的事情有了更好的理解。

爲了測試我用下面的XAML:

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Glyphs 
    FontUri="C:\Users\Public\Desktop\A.ttf" 
    FontRenderingEmSize="100" 
    Fill="Black" 
    UnicodeString="Test"/> 
</Page> 

使用運行於.NET 2運行時,我可以可靠地使XAML不管在哪裏放置的字體XamlPadX應用。

使用在.NET 4運行時上運行的Kaxaml應用程序,XAML通常無法呈現,具體取決於我將字體放在文件系統中的位置。通過移動字體文件並重命名,我嘗試在允許的內容中發現一個模式。但是,很難看到一種模式。

例如存儲路徑中的字體下面將呈現字形:從A.ttf

C:\Users\Public\Desktop\A.ttf - OK 

重命名它B.ttf會拋出異常:

C:\Users\Public\Desktop\B.ttf - throws exception 

更改擴展名也將拋出例外:

C:\Users\Public\Desktop\A.odttf - throws exception 

重命名部分路徑有時會造成嚴重破壞,但我無法看到任何模式。最初我使用了臨時路徑,並且獲取異常會導致我遇到此問題以及有關不使用該路徑的答案。不過,後來我實際上已經能夠使用該路徑,只要文件的名稱是A.ttf而不是B.ttf這樣避免了臨時路徑是一個不確定的修復。

在某些時候,在用自己的WPF應用程序我的測試B.ttf文件名突然開始工作。但是,我不得不重新啓動Kaxaml應用程序之前,將接受B.ttf文件名。此外,在這一點上A.odttf文件名仍然拋出異常。

我的建議是使用像Kaxaml應用程序或創建一個小的WPF應用程序來測試哪個字體文件名是可接受的,然後使用它們。但是,我擔心這個錯誤的性質使得一個「好」的字體文件名可能在以後的時間點變成「不好」。只有時間會顯示。

1

根據XamlToys Doesn't work on framework 4.0???,問題是在用於部分字體的文件的擴展名。

當我改名.ofttf文件,我保存到.TTF,這一切再次工作。儘管如此,還沒有最初的模糊想法。似乎在.NET 4.0中是新的。

相關問題