Правильное использование словарей объединенных ресурсов в Silverlight 3 - PullRequest
7 голосов
/ 09 февраля 2010

Как я прочитал: 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/)

Спасибо Rob

Ответы [ 2 ]

7 голосов
/ 27 апреля 2010

Теперь я понимаю, что немного понятнее. Если у вас есть несколько ресурсов области приложения, которые иногда ссылаются друг на друга, вам необходимо (1) упорядочить их в главном словаре, объявленном в App.xaml, AND , который необходимо включить в каждый файл, раздел тянет в зависимых кусках. Так, если у меня есть три файла, например, Brushes.xaml, ScrollViewerStyles.xaml и ComboBoxStyles.xaml, а ComboBoxStyles.xaml зависит от первых двух, мне нужно просто добавить в начало этого файла:

<ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Brushes.xaml"/>
    <ResourceDictionary Source="ScrollViewerStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
3 голосов
/ 24 февраля 2010

Rob

Я понимаю документацию так же, как и вы. Я заметил, что можно также поменять местами словарь MergedDictionaries и получить такое же исключение времени выполнения:

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

Из документации в разделе "Словари объединенных ресурсов":

С точки зрения последовательности поиска словарь MergedDictionaries проверяется только после проверки всех ключевых ресурсов ResourceDictionary, который объявил MergedDictionaries. Затем проверяется каждый из словарей в MergedDictionaries в обратном порядке, в котором они объявлены в свойстве MergedDictionaries. Другими словами, логика поиска из коллекции объединенных словарей ресурсов - «последний пришел - первый вышел».

Кажется, что вы можете переопределить некоторые ключи, определенные в ResourceDictionaries, включив их в этом порядке, но вы не можете ссылаться на стиль из одного словаря, определенного перед другим, в последовательности поиска. Это расстраивает и не интуитивно понятно.

Полагаю, это было бы полезно, если бы у вас была коллекция "синих" стилей, и вы хотите переопределить их набором "оранжевых" стилей для другого клиента. Это можно сделать, включив оранжевые клавиши под синими клавишами в свою коллекцию MergedDictionaries, чтобы они сначала находились в последовательности поиска ресурсов.

В любом случае, я разделяю ваше разочарование и надеюсь на такую ​​функцию в ближайшем будущем.

...