ビルドアクションが「リソース」に設定されているC#WPFアプリに画像があります。これは単なるソースディレクトリ内のファイルであり、ドラッグ/ドロッププロパティダイアログを介してアプリのリソースコレクションに追加されていません。ストリームとして書き込もうとしていますが、ドット、スラッシュ、ネームスペースなど、さまざまなバリエーションを試しても、開けません。
「pack:// application:,/Resources/images/flags/tr.png」を使用して、xamlの別の場所で使用するためにアクセスできますが、それを含むストリームにアクセスできません。
ほとんどの場所で使用と表示されているようです
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();
}
私には運がありませんでした。
GetManifestResourceStreamは、従来の.NETリソース、つまりRESXファイルで参照されるリソース用です。これらは、WPFリソースとは異なります。つまり、Resourceのビルドアクションで追加されたリソースです。これらにアクセスするには、 Application.GetResourceStream を使用して、適切なpack:URIを渡します。これは、リソースのデータにアクセスするためのStreamプロパティを持つStreamResourceInfoオブジェクトを返します。
あなたはおそらく探しています Application.GetResourceStream
StreamResourceInfo sri = Application.GetResourceStream(new Uri("Images/foo.png"));
if (sri != null)
{
using (Stream s = sri.Stream)
{
// Do something with the stream...
}
}
私が正しいとしたら、正確な名前がわからないので、リソースストリームを開くのに問題がありますか?もしそうなら、あなたは使うことができます
System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceNames()
含まれているすべてのリソースの名前のリストを取得します。この方法で、イメージに割り当てられたリソース名を見つけることができます。
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);
}
}