11

ボタンのコンテンツを画像に設定しています。次のようになります。

<Button>
   <Image Source="pack://application:,,,/NavigationImages/nav_up_left.png" />
</Button>

私のプロジェクトには、NavigationImages という名前のサブフォルダーがあり、そのフォルダー内に画像ファイル nav_up_left.png があります。

Designer を表示すると画像が表示されますが、実行時にリソースが見つからないという IOException エラーが発生します。

Build Action は Resource に設定されています。

実際、これは 1 つのプロジェクトでうまくいきました。しかし、別のプロジェクトにコピーすると失敗します。これは信じられないほど単純な問題のように思えますが、私は困惑し、髪を引き抜く準備ができていることに気付きました. @_@

あなたの考えや提案は大歓迎です!

4

4 に答える 4

11

うーん、私はそれを理解しました...ちょっと。

その xaml コードを、出力タイプが Windows アプリケーションであるプロジェクトから、出力タイプがクラス ライブラリである別のプロジェクトにコピーしました。

当時は考えもしませんでしたが、出力タイプがクラス ライブラリの場合、パック URI を変更する必要があるようです。

"pack://application:,,,/NavigationImages/nav_up_left.png"だから私はそれをに変更する代わりに"/ProjectName;component/NavigationImages/nav_up_left.png"、今ではうまく機能しています。

なぜこれが機能し、前者ではないのか、100% 明確ではありません。WPF のパック URI に関する MSDN ドキュメントを読みましたが、おそらく何かを誤解していました。

出力タイプがクラス ライブラリのプロジェクトで、以前に使用していたものが機能しない理由を誰かが説明してくれる場合に備えて、この回答をオフのままにします。

私はおそらく本当に単純なものを見逃しています。@_@

于 2011-07-26T22:18:59.657 に答える
5

私はかなり長い間この同じ問題に苦しんでいました.オリジナルでうまくいかなかったのは、「コンポーネント」という言葉が欠けていたからだと思います. 私は、例えば、持っていました

myBitmapImage.UriSource = new Uri(@"pack://application:,,,/MyApp;images/mona2.jpg");

しかし、持っているべきだった

... = new Uri(@"pack://application:,,,/MyApp;component/images/mona2.jpg");

「コンポーネント」という単語は、その外観にもかかわらず、パス名の一部ではありません。これは、そこになければならない文字列リテラルです。なんで?いいアイデアだと思った人もいたと思います。

また、別の部分で苦労している人には、「MyApp」はどうですか? それが議会の名前です。プロジェクト名を右クリックして [プロパティ...] を選択すると、[アプリケーション] タブの下に [アセンブリ名:] フィールドが表示されます。

それを検索したくない場合 (または変更されてコードが壊れるのではないかと心配している場合) は、次のようにすることができます。

String appUri = @"pack://application:,,,/" + 
                  System.Reflection.Assembly.GetEntryAssembly().GetName().Name + ";";
String path = appUri + "component/images/mona2.jpg";
myBitmapImage.UriSource = new Uri(path);

あまりきれいなコードではないことは認めますが、明らかに短くすることができますが、必要な場所に移動できることを願っています。イメージ ファイルの "Build" プロパティを "Resource" に設定することを忘れないでください。

于 2013-10-30T19:14:24.507 に答える
2

あなたの状況で何が起こっていたかに光を当てるだけです。2パック目ウリ。働いたもの。ホスト アプリケーション以外のアセンブリにあるリソースを対象としています。どうやら、ホスト アプリケーションは問題のクラス ライブラリからこのリソースを読み込んでいたのでしょうか?

ここでパック URI スキームの違いを確認できます: MSDN パック URI スキーム

メイン アセンブリからリソースを参照する場合と、別のアセンブリからリソースを参照する場合、URI はわずかに異なります。

また、pack://application:,,, には「権限」と呼ばれるものが含まれており、省略すると基本的に相対パスになりますが、どちらもアプリケーション権限が想定されるほとんどの場合に有効です。

編集:基本的に /Subfolder/Resource.xaml(.jpg etc.) と /Assembly;component/Resource.xaml は非常に似ているため、後者はパーサー/ローダーに、メインアプリケーションのアセンブリではなく、参照されたアセンブリを探していることを伝えます. (これは検索の高速化に役立つと思います)。

于 2013-02-22T00:42:24.010 に答える
1

これを正しく行うためのもう1つの解決策:

イメージのビルド アクションを「リソース」に設定して再ビルドしたら、<Image />オブジェクトのプロパティに移動します。プロパティ ウィンドウには...ファイル リソース ブラウザが表示され、画像を選択するとSource="..."属性<Image />が正しく入力されます。

于 2012-08-16T23:42:23.040 に答える