2011-07-26 9 views
8

ボタンのコンテンツを画像に設定しています。私はNavigationImagesという名前のサブフォルダを持っており、そのフォルダ内の画像ファイルnav_up_left.pngである私のプロジェクトではデザインタイムパッケージでは、uriは有効ですが、実行時には有効ではありませんか?

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

:それは次のようになります。

デザイナを表示するとイメージが表示されますが、実行時にリソースを見つけることができないというIOExceptionエラーが発生します。

[ビルドアクション]が[リソース]に設定されています。

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

あなたのご意見やご提案をお待ちしております。

答えて

9

Whelp、私はそれを考え出しました...ちょっと。

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

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

"pack://application:,,,/NavigationImages/nav_up_left.png"の代わりに"/ProjectName;component/NavigationImages/nav_up_left.png"に変更しましたが、今はうまく動作しています。

なぜこれが元ではなく動作しているのかわかりません。私はMSDN documentation on pack URIs in WPFを読んだことがありますが、多分私は何かを誤解しました。

出力の種類クラスライブラリを持つプロジェクトで、私が以前に持っていたことがうまくいかなかった理由を、誰かがわかりやすく説明できます。

私はおそらく本当に簡単なものがありません。この権利を得るために@ _ @

+0

混乱しています...あなたはあなたの状態に変更しましたか "pack:// application:,,, ProjectName; component/NavigationImages/nav_up_left.png"? – mike01010

+1

こんにちは。私はこの問題を抱えてからしばらくしていましたが、私は "/ProjectName;component/NavigationImages/nav_up_left.png"に変更したと確信しています。 –

+0

これをテストしました。両方のオプションが動作します(pack:// application:,,, and with) – surfen

1

もう一つの解決策:あなたのイメージビルドアクションは、「リソース」とあなたが再建されているに設定されると

、あなたの<Image />オブジェクトのプロパティに移動します。プロパティウィンドウは、あなたの<Image />Source="..."属性が正しく入力されますあなたのイメージを選択するところ、...ファイルリソースブラウザを提供します。

2

をちょうどあなたのような状況で起こっていたことに光を照らします。 2番目のパックのURI。働いた人。リソースは、ホストアプリケーション以外のアセンブリに配置されています。その音によって、ホストアプリケーションは問題のクラスライブラリからこのリソースをロードしていましたか?

あなたはここにパックURIスキームの違いを確認できます。 MSDN Pack URI Scheme

URIの変更わずか本体からリソースを参照すると、別のアセンブリから1を参照します。

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

EDIT:基本的に/Subfolder/Resource.xaml(.jpgなど)と/Assembly;component/Resource.xamlは非常によく似ていますが、後者はパーサー/ローダーに、参照されているアセンブリではなく、主なアプリケーションのアセンブリ。 (私はこれが検索のスピードアップに役立つと思います)。

+0

+1これはおそらく間違ったことに最も近い説明です。 – Heliac

3

私はちょうどこの同じ問題を抱えていましたが、元来は間違っていた部分が「コンポーネント」という欠落していると思います。私は、例えば、

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"に設定してください!

関連する問題