Tôi đang mucking về với glyphs và tài liệu WPF và đã chạy vào một ngoại lệ tham chiếu null trong khuôn khổ .Net 4.WPF - Lưu phông chữ vào đĩa, sau đó instantiating GlyphTypeface cho phông chữ ném ngoại lệ. Tại sao?
Tôi trích xuất và lưu phông chữ đúng thành đĩa dưới dạng tệp .ttf, sau đó thử tạo Glyph dựa trên phông chữ. Lần đầu tiên tôi lưu phông chữ vào đĩa và khởi tạo GlyphTypeface dựa trên phông chữ sau khi tạo GlyphTypeface từ một phông chữ khác trong cùng một thư mục tôi nhận được ngoại lệ tham chiếu null.
Nói rằng tôi có phông chữ A và B. B chưa được lưu vào đĩa (A có thể hoặc không thể được lưu vào đĩa, đó dường như không thành vấn đề):
1) lưu vào đĩa B trong cùng thư mục với A,
2) tạo GlyphTypeface bằng phông chữ A,
3) tạo GlyphTypeface bằng phông chữ B = ngoại lệ.
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)
Nếu tôi khởi động lại ứng dụng và chạy lại (với phông chữ B đã có trên đĩa), bước 3 không ném ngoại lệ.
Mã để cứu một phông chữ vào đĩa chỉ đơn giản là viết một đoạn từ một dòng nhị phân và buông bỏ các tập tin:
if (!File.Exists(filename))
{
using (FileStream fs = File.Create(filename, length))
{
fs.Write(m_data, m_index, length);
fs.Close();
}
}
Bất kỳ ý tưởng? Tôi không muốn phải đặt mọi phông chữ trong thư mục riêng của mình ...
Cảm ơn thời gian của bạn.
Cách giải quyết phông chữ cho mỗi thư mục không hoạt động đối với tôi, bạn có bao giờ tìm thêm thông tin về vấn đề này không? – Cheetah
Không, xin lỗi. Cách giải quyết vẫn đang làm việc cho tôi. Tôi đang sử dụng .Net 4.0 (và tôi nghĩ rằng nó không phải là một vấn đề trong. Net 3.5 SP1, nhưng tôi không tích cực). Tôi kiểm tra xem một phông chữ tồn tại trong một thư mục trước khi tôi tạo nó; Tôi nghi ngờ rằng nếu bạn tạo một phông chữ trong thư mục riêng của nó và sau đó cố gắng xóa/ghi đè lên nó (mà không cần khởi động lại ứng dụng của bạn) nó sẽ ném ngoại lệ. – AndrewS