我在C#WPF应用程序中有一个图像,其构建操作设置为“资源”。它只是源目录中的一个文件,尚未通过拖放属性对话框添加到应用程序的资源集合中。我试图把它写成一个流,但我无法打开它,尽管尝试了很多点,斜线,命名空间和其他所有的变化。
我可以访问它以在xaml中使用“pack:// application:,,, / Resources / images / flags / tr.png”在其他地方使用,但我无法获取包含它的流。
大多数地方似乎都说使用
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();
}
我没有运气。
答案 0 :(得分:26)
您可能正在寻找Application.GetResourceStream
StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png"));
if (sri != null)
{
using (Stream s = sri.Stream)
{
// Do something with the stream...
}
}
答案 1 :(得分:25)
GetManifestResourceStream用于传统的.NET资源,即RESX文件中引用的资源。这些与WPF资源不同,即那些添加了Resource的构建操作的资源。要访问这些,您应该使用Application.GetResourceStream,传入相应的包:URI。这将返回一个StreamResourceInfo对象,该对象具有Stream属性以访问资源的数据。
答案 2 :(得分:6)
如果我说得对,那么打开资源流会有问题,因为你不知道它的确切名称?如果是这样,你可以使用
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
获取所有包含资源的名称列表。这样,您就可以找到分配给您图像的资源名称。
答案 3 :(得分:1)
不需要调用Close()方法,它将在using子句的末尾由Dispose()自动调用。所以你的代码可能如下所示:
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);
}
}