WPF リソースが別のプロジェクトで定義されている場合の Visual Studio デザイナー エラーの回避
-
23-08-2019 - |
質問
WPF リソースが別のプロジェクトで定義されている場合、Visual Studio デザイナーのエラーを回避するにはどうすればよいですか?
複合 WPF アプリケーションには 3 つのプロジェクトがあります。メイン アプリケーション、「インフラストラクチャ」ライブラリ、および「モジュール」ライブラリ。メイン アプリケーションは、出力 DLL を介して他のプロジェクトを参照します (プロジェクトは単一のソリューションにまとめて配置されていません)。
スキン (一部のブラシとスタイルを定義しています) ResourceDictionary
)「インフラストラクチャ」ライブラリにあります。メインアプリケーションでスキンを選択し、それをアプリケーション全体で利用できるようにしたいと考えています(経由) MergedDictionaries
App.xaml 内)。
私のモジュールでは、メイン アプリケーションがロードするスキンで定義されたリソースを使用したいと考えています。次のようにローカルで利用できるかのようにリソースを参照すると、次のようになります。
Background={StaticResource MainBackgroundBrush}
ほぼすべてが希望どおりに機能します。例外は、Visual Studio のデザイナーが混乱して、「StaticResource 参照 'MainBackgroundBrush' が見つかりませんでした」と表示されることです。これにより、事実上、デザイナーを使用できなくなります。
「スキン」を定義するにはどうすればよいですか ResourceDictionary
プロジェクト内で、メイン アプリケーションでそのスキンを参照し、そのリソースをモジュール プロジェクトで使用しますか?
解決 2
一つめることが考えられる使用 DynamicResource
よ StaticResource
.Visual Studio2008のデザイナーだけ表示制御なスタイリングのように、VS2010beta1な場合が解消される訳ではありません、 StaticResource
.
を使用 DynamicResource
適切な場合、特定のスタイルを変更でランタイム時にスのスキン.
この関連の質問を支援す:
- 組み立て-広/ルートレベルのリズム-志賀直哉におけるコンポーネントのラインナップクラスライブラリ
- の違いについて教えてくださいStaticResourceとDynamicResourceにコンポーネントのラインナップ?
- コンポーネントのラインナップダイナミックvs静的資源
また人と DynamicResource
使用すべきときには、地元:
他のヒント
あなたはのResourceDictionaryから継承し、独自ののResourceDictionaryクラスを作成することができます。 そして、あなたは、設計時にそれを手配することができ、いくつかの明示的なスタイルを定義し、このカスタムResourceDictionaryの負荷(すなわち、実行時にアプリケーションからロードされたもの)、実行時にそれがすべてで何もしないのに対し。 IsInDesignMode-プロパティは、このために評価することができます。
そして、あなただけのs.th.を使用し、あなたが「DesignTimeResourceDictionary」と呼ばれる、そのようなクラスを持っていると言います
のような <UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<Util:DesignTimeResourceDictionary Source="SomeUriToYourResources"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
設計時に、あなたのリソースをロードし、デザイナーの作業を行います。 実行時に、あなたは、あなたのDesignTimeResourceDictionaryは、リソースの読み込みをスキップし、所望の動作を実現することができます。
あなたが必要な場合は、、あなたは本当にこのため、実際のリソースのコピーを作成することができ、またはあなたがちょうどあなたがデザイナーの作業を維持するために必要なすべてのキーを含むダミーの辞書を作成することができます。
サイモン D を拡張したいだけです。答え。彼が提案しているのは、私が現在使用している解決策です。完全なソースコードを共有したかっただけです。それはこれからです デザインモード時にのみ ResourceDictionary を使用するためのトリック ソース。
public class DesignTimeResourceDictionary : ResourceDictionary
{
/// <summary>
/// Local field storing info about designtime source.
/// </summary>
private string designTimeSource;
/// <summary>
/// Gets or sets the design time source.
/// </summary>
/// <value>
/// The design time source.
/// </value>
public string DesignTimeSource
{
get
{
return this.designTimeSource;
}
set
{
this.designTimeSource = value;
if ((bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)
{
base.Source = new Uri(designTimeSource);
}
}
}
/// <summary>
/// Gets or sets the uniform resource identifier (URI) to load resources from.
/// </summary>
/// <returns>The source location of an external resource dictionary. </returns>
public new Uri Source
{
get
{
throw new Exception("Use DesignTimeSource instead Source!");
}
set
{
throw new Exception("Use DesignTimeSource instead Source!");
}
}
}
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation Jump "
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml Jump "
Title="MainWindow" Height="350" Width="525"
xmlns:local="clr-namespace:WpfApplication1">
<Window.Resources>
<local:DesignTimeResourceDictionary DesignTimeSource="pack://application:,,,/BlueColors.xaml"/>
</Window.Resources>
<Grid>
<Button Background="{DynamicResource defaultBackground}"
HorizontalAlignment="Center" VerticalAlignment="Center">click me</Button>
</Grid>
</Window>