7

これらの辞書がある場合:

dict1.xaml: <Color x:Key="Color1">Red</Color>

dict2.xaml: <SolidColorBrush x:Key="Brush1" Color={StaticResource Color1} />

これは機能します:

アプリ.xaml:

<MergedDictionaries>
  <ResourceDictionary Source="dict1.xaml"/>
<MergedDictionaries>

SomePage.xaml:

<UserControl.Resources>
  <MergedDictionaries>
    <ResourceDictionary Source="dict2.xaml"/>
  </MergedDictionaries>
</UserControl.Resources>

これはしません:

App.xaml は両方をアプリケーション レベルでマージします。

Color1 が見つからないというエラーが表示されます。

どうしてこれなの ?/それを回避する方法はありますか? この例が単純化されていることはわかっていますが、実際の例は長すぎます。基本的に、スタイルとテンプレートを別のファイルに整理しようとしています。

  • 色の 1 つ
  • 暗黙のスタイル用の 1 つ
  • 明示的なスタイルの多く

編集:不思議なことに、プロパティをApplication_Startup設定する前にコードでこれRootVisualを行うと、エラーは発生しません...理由がわかりません!

4

4 に答える 4

5

残念ながら、Silverlight リソース システムで迷惑な制限に遭遇しましたが、これは最適化の問題であるとしか思えません。ここでは、各ディクショナリMergedDictionariesが並行してロードされる非同期動作があるようです。したがって、「dict2.xaml」がロードされている場合、存在する「dict1.xaml」のコンテンツに依存することはできません。

最も簡単な解決策は、Dict2 に Dict1 のマージを含めることです。

アプリ.xaml:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="dict2.xaml" />
<ResourceDictionary.MergedDictionaries>

Dict2.xaml:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="dict1.xaml" />
    </ResourceDictionary.MergedDictionaries>
    .... <!-- dict2 resource -->
</ResourceDictionary>
于 2011-04-24T20:53:29.670 に答える
1

これは App.xaml にあります

<Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="dict1.xaml" />
                <ResourceDictionary Source="dict2.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>

他の辞書の前に辞書を定義している限り、上記のようなものが機能しないことに少し驚いています。

于 2011-04-22T17:22:32.407 に答える
1

@Anthony によって提案された方法で実行できますが、ここで 1 つの注意点があります。たとえば、最初のリソース ディクショナリを 5 つの他のディクショナリで使用すると、5 回ロードされ、同じものの 6 つのコピーが作成されます。リソース ディクショナリ (App.xaml で参照した場合) は、パフォーマンスがあまり良くありません。これは、 http: //softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/ から Silverlight のリソース ディクショナリの小さなサブクラスを使用して修正できます。

于 2011-11-09T16:26:51.073 に答える
0

私はこれにタムを持っています。「マージされたリソースディクショナリのコレクションのリソースルックアップロジックは後入れ先出しです。」つまり、一方が他方を参照する複数のディクショナリがある場合、参照されるリソースを含むディクショナリはスタックの最上位にある必要があります。それらを正しい順序で参照していることを確認し、スタックの一番上の辞書がスタックの一番下の辞書に依存していないことを確認するように注意してください

<Application.Resources>         
 <ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>                                     
   <ResourceDictionary Source="Dict1.xaml" /> 
   <ResourceDictionary Source="dependsOnDict1.xaml" />                   
  </ResourceDictionary.MergedDictionaries>         
 </ResourceDictionary>     
</Application.Resources> 
于 2012-02-27T15:02:32.210 に答える