web-dev-qa-db-ja.com

WPF UserControlが参照プロジェクトでXAMLリソースを見つけられない

私のWPFプロジェクトでは、ユーザーコントロールを別のライブラリプロジェクトに保持しています。ユーザーコントロールは、次のように、別のXAMLファイル内のリソースにアクセスします。

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>

リソースファイルViewResources.xamlは、Resourcesという名前のコントロールライブラリプロジェクトのフォルダーにあります。デフォルトのビルドアクション(ページ)とカスタムツール(MSBuild:Compile)があります。

問題は、WPFアプリケーションでコントロールライブラリを参照し、ユーザーコントロールを使用するときです。実行時に、次のXamlParseExceptionが発生します。

Set property 'System.Windows.ResourceDictionary.Source' threw an exception.

...これはIOExceptionをラップします。

Cannot locate resource 'resources/viewresources.xaml'.

どうすれば修正できますか?リソースファイルのビルドアクションを「コンテンツ」に変更して、それを出力ディレクトリ(ファイルや同様の「ダム」リソースで機能する)にコピーしてみました。しかし、役に立たない。また、ユーザーコントロールのプロパティも機能しません。

パスを指定するより良い方法はありますか?

リソースファイルをアプリケーションプロジェクトに移動する必要がありますか(ユーザーコントロールのドメインに属しているので、移動したくない)。

20
Tor Haugen

それを見つけた。

パスを指定するためのより良い方法があることがわかります Pack URIs 。 XAMLを次のように変更しました。

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/RoutingManager;component/Resources/ViewResources.xaml" />
        </ResourceDictionary.MergedDictionaries>
        <!-- Local styles here -->
    </ResourceDictionary>
</UserControl.Resources>

そしてそれはそれを修正しました。

26
Tor Haugen

他の誰かが同じ問題で苦労している場合に備えて、これを投稿する価値はあると思いました。構文などとの戦いに2時間以上費やしているため、解決策は非常に単純であることがわかりましたが、それほど明白ではありませんでした。別のコントロールライブラリからのパックされたリソースは、設計時に正常に動作し、エラーなしでコンパイルされるように見えますが、実行時に「Set property 'System.Windows.ResourceDictionary.Source'が例外をスローしました」というエラーで失敗します。コントロールライブラリからリソースアセンブリを単に参照するだけでは不十分であることがわかりますメインアプリケーションアセンブリのリソースディクショナリを含むアセンブリにREFERENCEを追加する必要もあります、そうでない場合はそうではないようですアプリケーションにコンパイルされます。 (つまり、スタートアップアプリケーション(app.xamlを含むもの)->参照の追加->参照されたリソースファイルを持つアセンブリを選択)。

お役に立てれば!

24
AdrianD

私の場合、同じライブラリにResourceDictionaryとUserControlがありましたが、メインアプリケーションとは別でした。私にとってうまくいったのは、Adamがコメントで提案した形式でアセンブリの名前を指定することであり、プロジェクトのResourceDictionaryをEmbedded ResourceからPageに変更する必要がありました。私はpack://形式を使用しようとしませんでしたが、それでもうまくいくと思います。

<ResourceDictionary Source="/AssemblyName;component/Assets/MyResource.xaml"/>
7
AlexDev

同じエラーが発生しました(IOException-ファイルが見つかりません)。そのため、1日が費やされ、二度と戻れません。

より単純な "/ assemblyname ..."も "pack:// .... "構文が機能しました。

メインアセンブリのリソースアセンブリを正しく参照していました。

上記のように、xamlリソースファイルのビルドアクションプロパティを「リソース」に変更すると、エラーは消えました。

しかし、次の行でXamlParseExceptionが発生しました。

<ImageBrush x:Key="WindowBackground" ImageSource="Images/gradient.png" />

(私は手でタイプしました)。

これにより、無効な依存関係を効果的に含めようとしたxamlリソースファイルが残りました。

奇妙なことに入力したImageSourceプロパティを削除し、再挿入しましたが、結果として表示されるプルダウンメニューから画像を選択しました。

結果の行はまったく同じに見えますが、明らかに異なります。

WPF(VS2013)が嫌いになり始めていますが、これが役立つことを願っています。

:0 /

1
Ian

同じ状況でしたが、パックURIは役に立ちませんでした。参照している(実行可能な)プロジェクトで「リソースが見つかりません...」という例外が発生しました。私を助けたのは、カスタムコントロールライブラリプロジェクトのResourceDictionaryファイルをEmbedded Resourceとして設定したことです。

0
LoBo