34

WPF リソースが別のプロジェクトで定義されている場合、Visual Studio デザイナー エラーを回避するにはどうすればよいですか?

複合 WPF アプリケーションには、メイン アプリケーション、「インフラストラクチャ」ライブラリ、および「モジュール」ライブラリの 3 つのプロジェクトがあります。メイン アプリケーションは、出力 DLL を介して他のプロジェクトを参照します (プロジェクトは 1 つのソリューションに一緒に配置されません)。

ResourceDictionary「インフラストラクチャ」ライブラリでスキン (のいくつかのブラシとスタイル) を定義しています。メイン アプリケーションでスキンを選択し、アプリケーション全体MergedDictionariesで (App.xaml を介して) 使用できるようにしたいと考えています。

私のモジュールでは、メイン アプリケーションがロードするスキンで定義されたリソースを使用したいと考えています。次のようにローカルで利用可能であるかのようにリソースを参照すると、次のようになります。

Background={StaticResource MainBackgroundBrush}

ほとんどすべてが希望どおりに機能します。例外は、Visual Studio のデザイナーが混乱し、「StaticResource 参照 'MainBackgroundBrush' が見つかりませんでした」と通知することです。これにより、デザイナーを使用できなくなります。

ResourceDictionaryプロジェクトで「スキン」を定義し、メイン アプリケーションでそのスキンを参照し、モジュール プロジェクトでそのリソースを使用するにはどうすればよいですか?

4

3 に答える 3

4

ResourceDictionary から継承して、独自の ResourceDictionary クラスを作成できます。次に、設計時にこのカスタム ResourceDictionary が明示的に定義されたスタイル (つまり、実行時にアプリから読み込まれたスタイル) を読み込むように調整できますが、実行時には何もしません。これについて IsInDesignMode-Property を評価できます。

「DesignTimeResourceDictionary」と呼ばれるそのようなクラスがあり、s.th を使用するとします。お気に入り

 <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <Util:DesignTimeResourceDictionary Source="SomeUriToYourResources"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
 </UserControl.Resources>

設計時にリソースをロードし、デザイナーを機能させます。実行時に、DesignTimeResourceDictionary でリソースの読み込みをスキップし、目的の動作を実現できます。

必要に応じて、このために実際のリソースのコピーを実際に作成することも、デザイナーの動作を維持するために必要なすべてのキーを含むダミーの辞書を作成することもできます。

于 2009-07-10T19:21:03.857 に答える
3

DynamicResource考えられる解決策の 1 つは、ではなくを使用することですStaticResource。Visual Studio 2008 デザイナーは、VS2010 ベータ 1 がStaticResource.

使用DynamicResourceは、スキニングなど、実行時に特定のスタイルが変更される可能性がある状況で適切です。

これを裏付ける関連する質問がいくつか見つかりました。

DynamicResourceまた、リソースがローカルでない場合は常に使用する必要があると述べている人も見つけました。

于 2009-07-09T21:36:25.893 に答える