2009-09-07 34 views
27

Yapım eylemi 'Kaynak' olarak ayarlanmış bir C# WPF uygulamasında bir resmim var. Bu sadece kaynak dizindeki bir dosyadır, sürükle/bırak özellikleri iletişim kutusundaki uygulamanın kaynak koleksiyonuna eklenmemiştir. Bir akım olarak yazmayı deniyorum, ancak birkaç nokta, eğik çizgi, isim alanı ve görünüşte her şeyden farklı olmasına rağmen onu açamıyorum.Bir derleme olarak derlemeden kaynak

Başka bir yerde kullanmak için xaml dosyasında "pack: // application: ,,,/Resources/images/flags/tr.png" ile erişebilirim ancak onu içeren bir akışa ulaşamıyorum.

Çoğu yerde kullanacağım ben yana şansı olmadı

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(); 
} 

söylemek gibi görünüyor.

cevap

23

GetManifestResourceStream aradığınız yani RESX dosyalarında başvurulan bu geleneksel NET kaynaklarına içindir. Bunlar WPF kaynakları ile aynı değildir, yani Kaynak oluşturma eylemiyle eklenenler. Bunlara erişmek için uygun pakette geçen U123: Application.GetResourceStream'u kullanmalısınız. Bu, kaynağın verilerine erişmek için bir Stream özelliğine sahip bir StreamResourceInfo nesnesi döndürür.

+0

Teşekkürler, bunu hiç bulamadım. :) – Echilon

1

Close() yöntemini çağırmaya gerek yoktur, otomatik olarak kullanım maddesinin sonunda Dispose() tarafından çağrılır. Yani kod aşağıdaki gibi görünebilir:

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

Bu soruya nasıl cevap veriyor? –

+0

Gerçekten mi? Doğruysa, yararlı bilgiler. Her zaman açıkça arayarak Close'un akışlar/dosyalar için daha iyi olduğunu düşündüm. – Echilon

+0

Kullanım ifadesinin kullanımı, dolaylı olarak, Kapat yöntemini Gizli olarak çağıran Akışın elden çıkarma yöntemini çağırıyor. Ayrıca, kullanım ifadesi her ne kadar bir istisna kaldırılmış olsa da, "kullanılmış" nesneyi her zaman imha eder, dolayısıyla kullanım her şey dahil, neredeyse hiç hata içermeyen bir ifadedir. – BeardinaSuit

6

Sana doğru alırsanız onun tam adını bilmiyorum, çünkü, kaynak akışını açmak için bir sorun var? Eğer öyleyse, dahil edilen tüm kaynakların isimlerinin bir listesini almak için

kullanabilirsiniz. Bu şekilde görüntünüze verilen kaynak adını bulabilirsiniz.

+0

Neden "GetExputingAssembly" yerine "GetCallingAssembly" kullanılmıyor? – Odys

25

Muhtemelen 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

Eklemek için, dosyalar "Kaynak" olarak oluşturulmalıdır. http://stackoverflow.com/a/7394894/355264 –

İlgili konular