7

私が読んだように:http://msdn.microsoft.com/en-us/library/cc903952 (VS.95).aspx 、特に「ResourceDictionaryを使用した前方参照」というラベルの付いたセクション:

特定のリソースディクショナリ内からの静的リソース参照は、リソース参照の前に字句的に定義されているリソースを参照する必要があります。前方参照は、静的リソース参照では解決できません。このため、静的リソース参照を使用する場合は、リソースごとのさらなる使用を目的としたリソースがそれぞれのリソースディクショナリの先頭またはその近くで定義されるように、リソースディクショナリ構造を設計する必要があります。

これは、App.xamlでこのようなことを実行できないことを意味しますか?

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Colors.xaml"/>
            <ResourceDictionary Source="Assets/Brushes.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Brushes.xamlにSolidColorBrush、LinearColorBrushなどが含まれている場合、Colors.xamlで定義されている色を参照する定義はありますか?

例えば

<SolidColorBrush x:Key="OrangeRedBrush" Color="{StaticResource AppOrangeRed}"/>

Colors.xamlで次のように色を定義します。

<Color x:Key="AppOrangeRed">#FFBF3C1F</Color>

たとえば、キー「AppOrangeRed」のリソースが見つからないことを示すランタイムエラーが発生します。

色とブラシを整理して再利用できるようにするためのベストプラクティスは何ですか(適切な場合、色は構造体であり、ブラシは参照オブジェクトであると理解しています。http: //weblogs.manas.com.ar/spalladino/2009/で説明されています)。 03/02 / silverlight-xaml-guidelines /

ありがとうロブ

4

2 に答える 2

7

もう少しわかりやすくなりました。相互に参照することがある複数のアプリケーションスコープリソースがある場合は、(1)App.xamlで宣言されたマスターディクショナリでそれらを並べ替える必要があります。また、各ファイルに依存部分を取り込むセクションを含める必要があります。したがって、たとえば、Brushes.xaml、ScrollViewerStyles.xaml、ComboBoxStyles.xamlの3つのファイルがあり、ComboBoxStyles.xamlが前の2つに依存している場合は、そのファイルの先頭に追加する必要があります。

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
    <ResourceDictionary Source="ScrollViewerStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
于 2010-04-26T23:03:35.467 に答える
3

ロブ、

私はあなたと同じようにドキュメントを理解しています。このようにMergedDictionariesを交換しても、同じランタイム例外を受け取る可能性があることに気付きました。

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Assets/Brushes.xaml"/>
            <ResourceDictionary Source="Assets/Colors.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

「マージされたリソースディクショナリ」の下のドキュメントから:

ルックアップシーケンスに関しては、MergedDictionariesディクショナリは、MergedDictionariesを宣言したResourceDictionaryのすべてのキーリソースをチェックした後にのみチェックされます。次に、MergedDictionariesプロパティ内で宣言された順序とは逆に、MergedDictionaries内の各ディクショナリがチェックされます。つまり、マージされたリソースディクショナリのコレクション内からの取得ロジックは後入れ先出しです。

ResourceDictionariesで定義された特定のキーをこの順序で含めることでオーバーライドできるようですが、ルックアップシーケンスで別のディクショナリの前に定義されたディクショナリからスタイルを参照することはできません。これは苛立たしく、直感的ではありません。

これは、「青」のスタイルのコレクションがあり、別のクライアントの「オレンジ」のスタイルのセットでそれらをオーバーライドしたい場合に役立つと思います。これを実現するには、MergedDictionariesコレクションの青いキーの下にオレンジ色のキーを含めると、リソースルックアップシーケンスで最初に検出されます。

とにかく、私はあなたの欲求不満を共有し、近い将来のある時点でこのような機能を期待しています。

于 2010-02-24T15:50:10.057 に答える