2012-05-09 7 views
11

Tôi có một ứng dụng sử dụng một tập hợp thư viện riêng cho các tài nguyên (nhưng không phải là một assembly chỉ có tài nguyên không có mã), và tôi muốn bao gồm một phông chữ tùy chỉnh trong thư viện.Trong WPF, làm thế nào để tôi tham khảo một phông chữ trong một thư viện tài nguyên trong mã phía sau?

Tôi có thể lấy phông chữ, là Open Type Font, để tải nếu tôi thêm tệp .otf làm tài nguyên cho dự án cho assembly thực thi (chứ không phải dự án thư viện tài nguyên), với thuộc tính được đặt làm xây dựng hành động = 'Resource' và Sao chép vào Output = 'không Sao chép', bằng cách sử dụng đoạn mã sau:

FontFamily font = new FontFamily(new Uri("pack://application:,,,/"), 
         "./Resources/#CustomFont")); // Resources is a subfolder 

Khi tôi cố gắng thêm font cho dự án thư viện tài nguyên, tuy nhiên, phông chữ không tải . Tôi đã thử sử dụng đoạn mã sau để tải nó (cũng lưu ý: Tôi không có nhiều kinh nghiệm với gói URI):

FontFamily font = new FontFamily(new Uri("pack://application:,,,/MyLibrary"), 
         "./Resources/#CustomFont")); 
         // there is a Resources subfolder in my library as well 
         // not sure about whether I need the . 

Thư viện này hoạt động với các tài nguyên khác, chẳng hạn như hình ảnh.

Tôi cũng đã thử một loạt các hoán vị khác cho URI mà không thành công (nó cũng không ném ngoại lệ, chỉ hiển thị với phông chữ mặc định, không chắc đây có phải là vấn đề riêng) hay không.

Tôi đã làm việc từ Packaging Fonts with Applications trên MSDN, có ví dụ về tạo thư viện tài nguyên phông chữ, nhưng không có ví dụ nào sử dụng mã phía sau (tôi buộc phải sử dụng mã phía sau cho điều này).

Bất kỳ ý tưởng nào về những gì tôi cần làm? Tôi có theo dõi không?

Trả lời

15

Tôi có nó làm việc trong ứng dụng của tôi (tải phông chữ từ một hội đồng khác trong mã sau). Đối với một phông chữ URI như thế này:

pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/#Swis721 Md BT 

Con đường tôi đã nhận nó để làm việc (sau khi thử nghiệm đau đớn và không bị lỗi, nếu tôi nhớ chính xác) là:

new FontFamily(
    new Uri("pack://application:,,,/MyAssembly.Name;component/Resources/Fonts/"), 
    "./#Swis721 Md BT" 
) 

Hy vọng rằng sẽ giúp.

+0

này không làm việc cho tôi, điều này gợi ý tôi có một số khác vấn đề vì nó làm việc cho bạn. – Pysul

+0

Cảm ơn, đối với tôi nó đã làm việc ... đã cứu tôi rất nhiều thử thách và lỗi! – yvesonline

+0

Tôi có thể xác nhận nó hoạt động hoàn hảo và trước khi tôi thử quá nhiều kết hợp tải mà không thành công !!! Tôi nghĩ rằng một truy cập tương đối với các nguồn lực từ bên trong dll sẽ là đủ nhưng dường như thêm tên lắp ráp là cần thiết ngay cả khi phông chữ nên được truy cập từ cùng một hội đồng! – too

1

WPF không hỗ trợ tạo đối tượng FontFamily theo lập trình sử dụng ký hiệu gói.

Các tài liệu nói nó ở cuối trang, here

Dưới đây là đoạn trích:

Absolute URI bằng cách sử dụng gói: ký hiệu: ứng dụng WPF không cho phép bạn tạo ra một Đối tượng FontFamily lập trình sử dụng "pack:" như một phần của tham chiếu định danh tài nguyên thống nhất tuyệt đối (URI) cho một phông chữ. Ví dụ: "pack: // application: ,,,/resources/# Pericles Light" là tham chiếu phông chữ không hợp lệ.

+0

Vậy tại sao nó hoạt động đối với một số người? – IneedHelp

+0

Vâng, mà không nhìn vào mã tôi thậm chí không thể bắt đầu hiểu. Nhưng các tài liệu nói rằng nó không. Tôi có thể nói rằng các tài liệu sẽ được tin cậy :) – Ninglin

+0

Tôi muốn nói rằng những người trong bài viết nói rằng họ quản lý để làm cho nó hoạt động, nhưng bạn nói đúng, tài liệu có độ tin cậy cao hơn. – IneedHelp

0

(Tôi biết, câu hỏi cũ, nhưng tôi đã không tìm thấy một câu trả lời đúng.)

câu trả lời của Ross chỉ hoạt động trong một số phiên bản của netframework. (Không hoạt động trên netframework 4.6)

Tôi nghĩ rằng đây là câu trả lời tốt nhất:

Tiến hành thống kê Fonts trong một ứng dụng:

foreach (FontFamily fontFamily in Fonts.GetFontFamilies(new Uri("pack://application:,,,/"), "./resources/")) 
      { 
       // Perform action. 
      } 

reference