2012-01-03 16 views
1

は、IA別のアセンブリを実現していると私はそれをrefferencedています私のシェルWPFアプリケーション。WPF SharedResourceDictionary

私はエラー

次取得デザインビューに切り替えると、私はそれが場所にこのdictinaryでなく、作品Brushes.xamlを削除した場合、私のリソースは、次のよう

<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <Infrastructure:SharedResourceDictionary Source="pack://application:,,,/CuratioCMS.Client.Resources;Component/Themes/General/Brushes.xaml" /> 
      <Infrastructure:SharedResourceDictionary Source="pack://application:,,,/Fluent;Component/Themes/Office2010/Silver.xaml" /> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
    </Application.Resources> 

int型app.xamlで定義されてい

呼び出しの対象によって例外がスローされました

誰かが問題を理解するのに役立つかもしれませんか?

+0

問題がまだ残っている場合は、内部例外がありますか?また、ソリューション構成はx64に設定されていませんか?それはデザインビューで不思議な問題を引き起こす可能性があります。 – Sheridan

+0

x64に設定するとどういう意味ですか?ビルド構成を意味するのですか?いいえ、x64に設定されていません –

+0

さて、Visual Studioを見てみましたが、実際にはソリューション構成ではなく「ソリューションプラットフォーム」と呼ばれています。しかし、私はそれがあなたの問題ではないことを収集します。 – Sheridan

答えて

0

私はどこかで、それはメモリの問題です@設計時です。私はソースのセッターでそれを解決:

public string SourcePath { get; set; } 

    public new Uri Source 
    { 
     get 
     { 
      if (IsInDesignMode) 
      { 
       return base.Source; 
      } 
      else 
      { 
       return _sourceUri; 
      } 

     } 
     set 
     { 
      if (value == null) 
       return; 

      if (IsInDesignMode) 
      { 
       var dict = Application.LoadComponent(new Uri(SourcePath, UriKind.Relative)) as ResourceDictionary; 
       MergedDictionaries.Add(dict); 
       return; 
      } 

      _sourceUri = value; 
      if (!_sharedDictionaries.ContainsKey(value)) 
      { 
       base.Source = value; 

       _sharedDictionaries.Add(value, this); 
      } 
      else 
      { 
       MergedDictionaries.Add(_sharedDictionaries[value]); 
      } 
     } 
    } 

、私のXAMLでの:

/// <summary> 
    /// Gets or sets the uniform resource identifier (URI) to load resources from. 
    /// </summary> 
    public new Uri Source 
    { 
     get { return _sourceUri; } 
     set 
     { 
      _sourceUri = value; 
      if (!_sharedDictionaries.ContainsKey(value)) 
      { 
       try 
       { 
        //If the dictionary is not yet loaded, load it by setting 
        //the source of the base class 
        base.Source = value; 
       } 
       catch (Exception exp) 
       { 
        //only throw exception @runtime to avoid "Exception has been 
        //thrown by the target of an invocation."[email protected] 
        if(! IsInDesignMode) 
         throw; 
       } 
       // add it to the cache 
       _sharedDictionaries.Add(value, this); 
      } 
      else 
      { 
       // If the dictionary is already loaded, get it from the cache 
       MergedDictionaries.Add(_sharedDictionaries[value]); 
      }     
     } 
    } 
+1

これを試してみますが、このタイプの辞書を使用することに関連する質問が1つあります。 WPF 4でこのアプローチを使用する必要がありますか? –

3

私はこの問題を解決するために(私は実際に2010年のVisualStudioで設計時に動作するように望んでいた)

<SharedResourceDictionary SourcePath="JooThemes;component/Buttons/Small/SettingsToggleStyle.xaml" Source="/JooThemes;component/Buttons/Small/SettingsToggleStyle.xaml" /> 
+0

あなたは何が間違っていたのか、なぜSourcePathをsourceパラメータで使用するのか説明できますか? –

+0

これについて考えると、実際にはソースプロパティSourcePathは必要ありませんでした!これは別の方法で回避することができます。質問は次のとおりです。 –

+0

base.Source = value; Visual Studio 2010のデザイン時に例外が発生します。 コード:Application.LoadComponentは相対パスのみを受け入れるため、ソースプロパティの絶対パスまたは相対パスを設定しています。また、SourcePathは受け入れられる相対パスのみを使用し、デザイン時の視覚化を取得します。 –