WPF リソースが別のプロジェクトで定義されている場合の Visual Studio デザイナー エラーの回避

StackOverflow https://stackoverflow.com/questions/1088762

質問

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

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

スキン (一部のブラシとスタイルを定義しています) ResourceDictionary)「インフラストラクチャ」ライブラリにあります。メインアプリケーションでスキンを選択し、それをアプリケーション全体で利用できるようにしたいと考えています(経由) MergedDictionaries App.xaml 内)。

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

Background={StaticResource MainBackgroundBrush}

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

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

役に立ちましたか?

解決 2

一つめることが考えられる使用 DynamicResourceStaticResource.Visual Studio2008のデザイナーだけ表示制御なスタイリングのように、VS2010beta1な場合が解消される訳ではありません、 StaticResource.

を使用 DynamicResource 適切な場合、特定のスタイルを変更でランタイム時にスのスキン.

この関連の質問を支援す:

また人と 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>
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top