2

MicrosoftPrismとUnityを使用してモジュラーアプリケーションを作成しています。私のアプリケーションのShellプロジェクトは、さまざまなDLLをロードします。これらはすべて、独自の/resourcesまたは/imagesフォルダーとユーザーインターフェイスビューを含みます。したがって、各モジュールはDLLです。

アプリケーションでリソースを使用しようとしているとき、それを機能させるには、その場所について非常に明確にする必要があるようです。たとえば、同じmodule/dllで画像を見つけるには次のようにします。

<Image Source="pack://application:,,,/MyCompany.MyProduct.MyModule;Component/Images/ZoomIn.gif" />

本当に毎回長い形式のURIを使用する必要がありますか?私は次のような短いバージョンを試しました:

pack://application:,,,/Images/ZoomIn.gif

Images/ZoomIn.gif

ZoomIn.gif

おそらく2番目のバージョンが機能するはずだと思いました。Uriの例を見ると、「現在のアセンブリに対して」とよく言われます。これは、実行中の実行可能ファイルであるアセンブリですか?それとも、これはコードが属するアセンブリ(私のライブラリ/モジュール)ですか?

アップデート:

Peter Hansenの助けを借りて、私はそれを次のように短縮することができました。

<Image Source="../Images/ZoomOut.png" />

ビューがサブフォルダーにあったため、どうやら../を使用する必要がありました。タイプコンバーターがこれを行うので、pack://構文を省略することもできます。

4

1 に答える 1

6

WPFでバイナリリソースを取得する場合、いくつかの異なるオプションがあり、それらはすべて、必要な動作の種類によって異なります。

  1. リソースをアセンブリ内に埋め込む必要がある場合は、それらをVisual Studioのプロジェクトに追加し、ビルドアクションを[リソース]に設定します。このように、それらはアセンブリにベイク処理されるため、簡単に変更することはできません。

  2. それらをルーズファイルとして残す必要がある場合は、それらをプロジェクトに追加し、ビルドアクションコンテンツに設定します。また、それらが出力ディレクトリにコピーされていることを確認してください。頻繁に交換する必要があり、毎回アセンブリを再コンパイルする必要がない場合は、これをお勧めします。

  3. それらをルーズファイルとして使用したいが、何らかの理由でVisual Studioソリューションに含めたくない場合(コンパイル時に認識されていない可能性があります)、フルパスまたはSiteOfOrigin表記と呼ばれるものを使用してアクセスできます。あなたの場合は関係ないので、これについては説明しません。

コードからリソースにアクセスするには、さまざまな形式のパックURIを使用します。

  • pack://application:,,,/img.jpg
    プロジェクトのルートにある画像を参照します。

  • pack://application:,,,/Folder1/Folder2/img.jpg
    プロジェクトのサブフォルダー内の画像を参照します。

  • pack://application:,,,/NameOfDll;Component/img.jpg
    VisualStudioに参照がある別のアセンブリの画像を参照します。

幸い、リソースがXAMLから参照される場合、完全なURIを記述する必要はありません。
場所の一部を完全なURIに変換できるTypeConverterが存在するため、基本的にそのpack://application:,,,部分を回避できます。

上記のポイント1と2では、実行時にアセンブリと一緒にルーズファイルとして存在するか、アセンブリ内に埋め込まれているかに関係なく、同じXAMLを使用してリソースを参照します。

ただし、手続き型コードからリソースを参照する場合は、完全に定義された明示的なURIを使用する必要があります。

これがどのように機能するかを示すために、いくつかのコードを記述し、いくつかの画像を含めました。

実行中のプログラムを示す画像 ソリューションエクスプローラービューの画像

関連するXAML:

<StackPanel>
    <TextBlock Text="Embedded in same assembly" />
    <Image Source="gift.png" />
</StackPanel>

<StackPanel>
    <TextBlock Text="Embedded in same assembly in a subfolder" />
    <Image Source="Content/Images/gift.png" />
</StackPanel>

<StackPanel>
    <TextBlock Text="Embedded in same assembly in a subfolder using full pack URI format" />
    <Image Source="pack://application:,,,/Content/Images/gift.png" />
</StackPanel>

<StackPanel>
    <TextBlock Text="Embedded in different assembly" />
    <Image Source="/Module1;Component/gift.png" />
</StackPanel>

<StackPanel>
    <TextBlock Text="Embedded in different assembly in a subfolder" />
    <Image Source="/Module1;Component/Images/gift.png" />
</StackPanel>

<StackPanel>
    <TextBlock Text="Embedded in different assembly in a subfolder using full Pack URI format" />
    <Image Source="pack://application:,,,/Module1;Component/Images/gift.png" />
</StackPanel>

<StackPanel>
    <TextBlock Text="Setting imagesource from code-behind" />
    <Image x:Name="image1" />
</StackPanel>

関連するコードビハインド:

public Window1()
{
    InitializeComponent();

    //Here we have to use the full Pack URI
    //image1.Source = new BitmapImage(new Uri("/Module1;Component/Images/gift.png")); //Throws exception..
    image1.Source = new BitmapImage(new Uri("pack://application:,,,/Module1;Component/Images/gift.png"));
}

更新リソースがそれを使用しているのと同じアセンブリにある場合、URI
の一部を含める理由はありません。/NameOfDll;Component/あなたの場合、なぜそれが機能しないのかわかりません。

Module1にウィンドウを追加しました。これは、独自のアセンブリ内の1つの画像を参照するだけで、正常に機能しているようです。WPFアプリケーションでボタンをクリックすると、ウィンドウが表示されます。

<Window x:Class="Module1.WindowTest"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             Title="Window from Module1">
    <Grid>
        <Image Source="Images/gift.png" />
    </Grid>
</Window>

リソースが表示された別のウィンドウを表示しています

于 2012-11-20T22:08:59.640 に答える