8

たとえば、次のプロジェクト構造があります。

Root\Core\Application.exe
Root\Modules\Assembly.dll
Root\Modules\Icons\Icon.png

My Application.exe は Assembly.dll を読み込みます。Assembly.dll には、Image コントロールを含む WPF UserControl が含まれています。Icon.png は埋め込みリソースではなく、ローカル ファイル (ビルド: コンテンツ) です。

Image Control の Source-Property で可能なすべての URI を試しましたが、画像が表示されません :-(

<Image Source="Icons\Icon.png" />
<Image Source="pack://application:,,,/Icons\Icon.png" />
<Image Source="pack://application:,,,/Assembly;component/Icons/Icon.png" />

URI はどのように見える必要がありますか?

4

1 に答える 1

5

このステートメントは、アセンブリ内のコンテンツ ファイルを参照できないことを意味します... (そのため、アプリケーションで指定されたコンテンツ ファイルのみが "application://" を使用して解決できます)。

http://msdn.microsoft.com/en-us/library/aa970069(v=vs.85).aspx

参照されたアセンブリのコンテンツ ファイルは、WPF でサポートされていないため含まれません。参照アセンブリに埋め込まれたファイルのパック URI は、参照アセンブリの名前と ;component サフィックスの両方が含まれているため、一意です。サイト オブ オリジン ファイルのパック URI は、siteoforigin:/// オーソリティを使用する唯一のパック URI を使用するため、一意です。

.exe が実行されている場所を参照する「siteoforigin」でどこかに到達する場合があります。

Source="pack://siteoforigin:,,,/../Modules/Icons/Icon.png"

また

Source="pack://siteoforigin:,,,/Icons/Icon.png"

相対パスをサポートしていない可能性がありますが。

これも試してみてください:

Source="../Modules/Icons/Icon.png" 

この:

Source="Icons/Icon.png" 

PackUriHelperPack URI を試すときの 1 つのヒントは、適切な構文/セマンティクスに準拠するように、 を使用してそれらを構築することです。

関連する投稿を参照してください。


別のアイデア....

PNG ファイルへの絶対パスを構築するのに役立つ独自の MarkupExtension を定義できます。

LoadFrom を使用して DLL をロードする直前に設定されたグローバル構成設定があります。

次に、XAML で拡張機能を使用するようにします。

Source={local:MyMarkupExtensionPathBuilder Icon.png}

これを出発点として使用してください...あなたの場合、「application://」を使用したくないのですが...「C:\」などの絶対「ファイル」パスタイプのURIとしてUriを構築したいProgram Files\myapplication\Root\Modules\Icons\icon.png".

MarkupExtension を取得して BitmapSource を直接返すことができます (または単に文字列を返すように取得することができます...その後、TypeConverter はとにかく BitmapSource に解決されます)。

(コンバーターを使用してパスの 2 つの部分を連結する Binding で同様のことを行うこともできます。または、1 つを使用する場合は ViewModel に連結を行わせることもできます...マークアップ拡張はそれを行うためのより適切な方法です)

于 2012-09-03T10:44:32.910 に答える