Правильное использование словарей объединенных ресурсов в Silverlight 3
Как я читаю: 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/)
Спасибо Роб
2 ответа
Теперь я понимаю, что немного понятнее. Если у вас есть несколько ресурсов области приложения, которые иногда ссылаются друг на друга, вам необходимо (1) упорядочить их в главном словаре, объявленном в App.xaml, И вам необходимо включить в каждый файл раздел, который включает зависимые части. Так, если у меня есть три файла, например, Brushes.xaml, ScrollViewerStyles.xaml и ComboBoxStyles.xaml, а ComboBoxStyles.xaml зависит от первых двух, мне нужно просто добавить в начало этого файла:
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Brushes.xaml"/>
<ResourceDictionary Source="ScrollViewerStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
Роб,
Я понимаю документацию так же, как вы. Я заметил, что также можно поменять местами словарь 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, чтобы они сначала были найдены в последовательности поиска ресурсов.
В любом случае, я разделяю ваше разочарование и надеюсь на такую функцию в ближайшем будущем.