2009-09-07 30 views
27

Tôi có một hình ảnh trong ứng dụng C# WPF có tác vụ xây dựng được đặt thành 'Tài nguyên'. Nó chỉ là một tệp trong thư mục nguồn, nó chưa được thêm vào bộ sưu tập tài nguyên của ứng dụng thông qua hộp thoại kéo/thả thuộc tính. Tôi đang cố gắng viết nó như một dòng, nhưng tôi không thể mở nó mặc dù cố gắng khá nhiều biến thể của dấu chấm, dấu gạch chéo, không gian tên và dường như mọi thứ khác.Tài nguyên từ tập hợp dưới dạng luồng

Tôi có thể truy cập nó để sử dụng ở nơi khác hoặc trong xaml với "pack: // application: ,,,/Resources/images/flags/tr.png", nhưng tôi không thể tải xuống luồng chứa nó.

Hầu hết những nơi dường như nói sử dụng

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) { 
    using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) { 
     while((read = reader.Read(buffer, 0, buffer.Length)) > 0) { 
      writer.Write(buffer, 0, read); 
     } 
     writer.Close(); 
    } 
    reader.Close(); 
} 

Mà tôi đã không có bất kỳ may mắn với.

Trả lời

23

GetManifestResourceStream là tài nguyên NET truyền thống tức là những người được tham chiếu trong file RESX. Chúng không giống như tài nguyên WPF, tức là những tài nguyên được thêm vào với hành động xây dựng của Tài nguyên. Để truy cập chúng, bạn nên sử dụng Application.GetResourceStream, chuyển vào gói thích hợp: URI. Điều này trả về một đối tượng StreamResourceInfo, có một thuộc tính Stream để truy cập dữ liệu của tài nguyên.

+0

Cảm ơn, tôi chưa bao giờ tìm thấy điều đó. :) – Echilon

1

Không cần gọi phương thức Close(), nó sẽ tự động được gọi bởi Vứt bỏ() ở cuối điều khoản sử dụng. Vì vậy, mã của bạn có thể trông giống như sau:

using(BinaryReader reader = new BinaryReader(System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("ResourceBlenderExpress.Resources.images.flags.tr.png"))) 
using(BinaryWriter writer = new BinaryWriter(File.OpenWrite(imageFile))) 
{ 
    while((read = reader.Read(buffer, 0, buffer.Length)) > 0) 
    { 
     writer.Write(buffer, 0, read); 
    } 
} 
+0

Cách này trả lời câu hỏi? –

+0

Thật sao? Thông tin chi tiết hữu ích nếu đó là sự thật. Tôi luôn nghĩ rõ ràng gọi Close là tốt hơn cho các luồng/tệp. – Echilon

+0

Việc sử dụng câu lệnh Sử dụng rõ ràng gọi phương thức vứt bỏ của Luồng đang ngầm gọi phương thức Đóng của nó. Ngoài ra, câu lệnh sử dụng luôn loại bỏ đối tượng "đã sử dụng", ngay cả khi một ngoại lệ được nâng lên, vì vậy việc sử dụng là một câu lệnh bao gồm tất cả, hầu như không có lỗi. – BeardinaSuit

6

Nếu tôi hỏi bạn, bạn có vấn đề mở luồng tài nguyên, bởi vì bạn không biết tên chính xác của nó? Nếu có, bạn có thể sử dụng

System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames() 

để nhận danh sách tên của tất cả các tài nguyên được bao gồm. Bằng cách này bạn có thể tìm thấy tên tài nguyên đã được xác nhận cho hình ảnh của bạn.

+0

Tại sao không sử dụng 'GetCallingAssembly' thay vì' GetExecutingAssembly'? – Odys

25

Bạn đang có lẽ tìm kiếm Application.GetResourceStream

StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png")); 
if (sri != null) 
{ 
    using (Stream s = sri.Stream) 
    { 
     // Do something with the stream... 
    } 
} 
+4

Để thêm, các tệp phải được tạo thành "Tài nguyên". http://stackoverflow.com/a/7394894/355264 –

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