11

私の状況はこれです。私が開発している多層アプリケーションを構成するWPFソリューションの下に複数のプロジェクトがあります。別々のプロジェクトが同じイメージまたはxamlリソースにアクセスする必要がある場合があるため、「パブリック」リソースを、これらの「パブリック」リソースを必要とする他のプロジェクトから参照できる1つのプロジェクトに集中させたいと思います。たとえば、バナー/ロゴとして機能する別々のプロジェクトのさまざまなコントロールやウィンドウで使用するBMPイメージがあります。この画像を必要とするすべてのプロジェクトに個別に追加するのではなく、この画像をリソースとしてパブリックリソースプロジェクトに追加し、他のプロジェクトから参照できるようにする必要があるようです。これが可能である場合、それはどのように見えるでしょうか、そして私はそれをどのように行えばよいですか?私のアイデアがうまくいかない場合は、提案を受け入れます。

ありがとう!

PS私はこのトピックをかなり検索しましたが、彼らが何をしているのかわからない人々からのごみの答えがたくさんあります。私はWPFに比較的慣れていないので、問題に対する直接的な回答を得たいと思います。

4

1 に答える 1

23

いじくり回して調べた後、私は自分の質問に対する解決策を見つけました。私の答えの断片がウェブ全体に散らばっているように見えるので、すべてを一度に1か所で説明しようと思います。要約すると、基本的に、ソリューション内のプロジェクト全体で使用されるリソースを一元化する必要がありました。これらは、これを達成するために私が最終的にたどったステップです。

1.ソリューションにユーザーコントロールプロジェクトを作成します(リソースディクショナリをホストできるプロジェクトであればすべて実行できます)。このプロジェクトを「リソースプロジェクト」と呼びます。

2.プロジェクト間で共有するリソースファイル(画像など)をリソースプロジェクトに追加します。意味のあるサブディレクトリにファイルを整理しようとしています。ビルドアクションを「Resource」に設定して、出力バイナリにコンパイルされるようにします。

3.次に、リソースディクショナリをリソースプロジェクトに追加します。私の場合、いくつかの画像を参照したかったので、「ImageDictionary.xaml」という名前の画像を作成しました。

4.リソースディクショナリの画像ファイルへの参照を追加します。ここでは画像を参照していますが、これは単なるリソース辞書であり、そこに何でも入れることができます。真ん中の文字列は、参照している画像ファイルへの相対パスです。

<ImageSource x:Key="SomeImageKey"> 
    Images/SomeImage.bmp
</ImageSource>

5.次に、手順4で作成したリソースディクショナリを必要とするプロジェクトに移動します。これは、別のユーザーコントロールまたはウィンドウのいずれでもかまいません。プロジェクト参照を右クリックして、リソースプロジェクトへの参照を追加します。

6.さて、現在のプロジェクトは、リソースプロジェクトで定義されているステップ4で作成したディクショナリを参照する必要があります。最初にユーザーコントロールを作成したので、これが私のコードのようになります...マージされた辞書を使用したことに注意してください。後でもっと使うつもりなので、単一の辞書ではなくこの方法を選びました。以下の「ResourceProject」は、リソースを追加したプロジェクト/アセンブリの名前です。「component」はそこにある必要があるキーワードであり、その後に辞書xamlコードファイルへのパスが続きます。

<UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>        
    </UserControl.Resources>

ご覧のとおり、外部リソースディクショナリを参照するには、「パックURI」と呼ばれるものが必要です。私はそれを行う簡単な方法を見つけました。長い道のりはかなり醜いです、そして私が知る限り、それに利点はありません。しかし、これが長い道のりの様子です。

<UserControl.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="pack://application:,,,/ResourceProjectAssembly;component/Resources/ImageDictionary.xaml" />  
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>        
    </UserControl.Resources>

7.現在のプロジェクトにリソースプロジェクト内のリソースディクショナリへの参照があるので、そのディクショナリから何でも使用できます。私は先に進み、ユーザーコントロールに画像を配置しました。以下はコードです。辞書をローカルで参照するのと同じです。

<Image Source="{StaticResource SomeImageKey}" />

8.重要な注意!これは私がそれを見つける前にしばらくの間私に頭痛を引き起こしました。スタートアッププロジェクトがリソースプロジェクトを使用しない場合でも、ソリューションのスタートアッププロジェクトにリソースプロジェクトへの参照があることを確認してください。(つまり、参照を右クリックしたり、参照を追加したりします...)これを行わない限り、リソースは出力にコンパイルされません。この部分は、デザイナーが私の画像を表示していて、xamlエラーがなかったため、注意が必要でしたが、実行時にsetプロパティがスローされ、ファイルの例外が見つかりませんでした。これは、スタートアッププロジェクトからリソースプロジェクトを参照したときになくなりました。

うまくいけば、これは誰かを助ける。以下は、すべての要素をまとめるために必要なものを提供してくれたいくつかの場所(stackoverflowを含む)へのリンクです。

http://blogs.msdn.com/b/wpfsldesigner/archive/2010/06/03/creating-and-sumption-resource-dictionaries-in-wpf-and-silverlight.aspx

外部ファイルまたはアセンブリからWPFスタイルまたはその他の静的リソースを読み込む

別のアセンブリのResourceDictionary

于 2012-12-02T09:22:54.563 に答える