2010-06-19 22 views
5

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.

Trả lời

2

Tôi đã kết thúc bằng cách sử dụng giải pháp thay thế lưu từng phông chữ vào thư mục riêng của nó (sử dụng tên phông chữ cho tên thư mục). Các trường hợp ngoại lệ đã biến mất, vì vậy tôi đoán chúng ta có thể viết nó lên một lỗi trong .Net.

+0

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

+0

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

0

Giải pháp thay thế của tôi chỉ đơn giản là thay thế < Glyphs> bằng equ2alent < TextBlock> s. Sự khác biệt về pixel trong bố cục không phải là vấn đề trong trường hợp của tôi.

Như bạn đã lưu ý là trường hợp của bạn, trong trường hợp của tôi cũng không phải là vấn đề trong .Net 3.5, nhưng đã xuất hiện trong .Net 4.0.

1

I (và đồng nghiệp) cuối cùng đã tìm thấy vấn đề cụ thể của chúng tôi là: không lưu các tệp phông chữ vào %TEMP%. Vì lý do nào đó, việc lưu các phông chữ vào một số thư mục khác làm cho nó hoạt động (đối với chúng tôi), và lưu nó vào bất cứ nơi nào bên trong %TEMP% làm cho nó bị hỏng.

+0

Lỗi tương tự mặc dù không lưu trong thư mục tạm thời. – Triynko

2

Lỗi này đã khiến tôi phát điên nhưng tôi nghĩ tôi hiểu rõ hơn về những gì đang diễn ra.

Để thử nghiệm tôi đã sử dụng XAML sau:

<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> 

Sử dụng ứng dụng XamlPadX mà chạy trên bộ thực thi .NET 2 Tôi chắc chắn có thể làm cho XAML không có vấn đề mà tôi đặt font.

Sử dụng ứng dụng Kaxaml chạy trên thời gian chạy .NET 4 XAML thường sẽ không hiển thị tùy thuộc vào nơi tôi đặt phông chữ trong hệ thống tệp. Bằng cách di chuyển các tập tin phông chữ xung quanh và đổi tên tôi đã cố gắng để khám phá một mô hình trong những gì được cho phép. Tuy nhiên, rất khó để nhìn thấy một mô hình.

Ví dụ lưu trữ các phông chữ trong đường dẫn dưới đây sẽ làm cho glyphs:

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

Đổi tên nó từ A.ttf để B.ttf sẽ ném ngoại lệ:

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

Thay đổi phần mở rộng cũng sẽ ném ngoại lệ:

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

Đổi tên các phần của đường dẫn đôi khi sẽ tàn phá nhưng tôi không thể thấy bất kỳ mẫu nào. Ban đầu, tôi đã sử dụng đường dẫn tạm thời và nhận các ngoại lệ dẫn tôi đến câu hỏi này và câu trả lời về việc không sử dụng đường dẫn đó. Tuy nhiên, sau đó tôi đã thực sự có thể sử dụng đường dẫn đó miễn là tên của tập tin là A.ttf và không B.ttf để tránh đường dẫn tạm thời không phải là một sửa chữa chắc chắn.

Tại một số thời điểm trong các thử nghiệm của tôi bằng cách sử dụng ứng dụng WPF của riêng tôi, tên tệp B.ttf đột nhiên bắt đầu hoạt động. Tuy nhiên, tôi phải khởi động lại ứng dụng Kaxaml trước khi nó chấp nhận tên tệp B.ttf. Ngoài ra, tại thời điểm đó, tên tệp A.odttf vẫn còn ném ngoại lệ.

Đề xuất của tôi là sử dụng một ứng dụng như Kaxaml hoặc để tạo một ứng dụng WPF nhỏ để kiểm tra tên tệp phông nào được chấp nhận và sau đó sử dụng chúng. Tuy nhiên, tôi sợ rằng bản chất của lỗi này là như vậy mà một tên tập tin phông chữ "tốt" có thể biến "xấu" tại một thời điểm sau đó trong thời gian. Chỉ có thời gian sẽ hiển thị.

1

Theo XamlToys Doesn't work on framework 4.0???, sự cố nằm trong phần mở rộng của tệp cho phông chữ một phần.

Khi tôi đổi tên tệp .ofttf tôi lưu thành .ttf, tất cả đều hoạt động trở lại. Chưa có ý tưởng mờ nhạt về lý do tại sao đó là mặc dù. Có vẻ là mới trong .NET 4.0.

Các vấn đề liên quan