Silverlight 4 - использовать StaticResource из одного ResourceDictionary в другом - PullRequest
7 голосов
/ 22 апреля 2011

Если у меня есть следующие словари:

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

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

Это работает:

App.xaml:

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

SomePage.xaml:

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

Это не:

App.xaml объединяет оба на уровне приложения.

Я получаю сообщение об ошибке, что Color1 не найден.

Почему это? / Есть ли способ обойти это? Я знаю, что этот пример упрощен, но реальный будет слишком длинным. По сути, я просто пытаюсь организовать свои стили и шаблоны в разные файлы:

  • Один для цветов
  • Один для неявных стилей
  • Многие для явных стилей

edit: любопытно, что если я сделаю это в коде на Application_Startup, перед установкой свойства RootVisual я не получу сообщение об ошибке ... Я просто озадачен, почему!

Ответы [ 4 ]

5 голосов
/ 25 апреля 2011

К сожалению, вы столкнулись с досадным ограничением в системе ресурсов Silverlight, которое, как я могу себе представить, является некоторой проблемой оптимизации. Кажется, здесь есть некоторое асинхронное поведение, когда каждый словарь в MergedDictionaries загружается параллельно, следовательно, когда загружается «dict2.xaml», вы не можете полагаться на содержимое «dict1.xaml».

Самое простое решение - включить слияние Dict1 с Dict2: -

App.xaml:

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

Dict2.xaml:

<ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="dict1.xaml" />
    </ResourceDictionary.MergedDictionaries>
    .... <!-- dict2 resource -->
</ResourceDictionary>
1 голос
/ 09 ноября 2011

Вы можете сделать это способом, предложенным @Anthony, но здесь есть одна оговорка - если вы используете свой первый словарь ресурсов, например, в 5 других словарях, он будет загружен 5 раз и у вас будет 6 копий. из того же словаря ресурсов (это в случае, когда вы ссылаетесь на него в App.xaml), что не очень хорошо для производительности. Это можно исправить с помощью небольшого подкласса словаря ресурсов silverlight здесь - http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/.

1 голос
/ 22 апреля 2011

Это будет в App.xaml

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

, пока вы определяете словарь до того, как другой, я немного удивлен, что-то похожее на приведенное выше не будет работать.

0 голосов
/ 27 февраля 2012

Я с Тэмом на этом.«Логика поиска ресурсов в коллекции объединенных словарей ресурсов -« последний пришел - первый вышел ».Другими словами, если у вас есть несколько словарей, где один ссылается на другой, то словарь, содержащий ресурсы, на которые ссылаются, должен быть на вершине стека.Убедитесь, что вы ссылаетесь на них в правильном порядке, и будьте осторожны, чтобы словари в верхней части стека НЕ ​​имели зависимостей от словарей в нижней части стека

<Application.Resources>         
 <ResourceDictionary>
  <ResourceDictionary.MergedDictionaries>                                     
   <ResourceDictionary Source="Dict1.xaml" /> 
   <ResourceDictionary Source="dependsOnDict1.xaml" />                   
  </ResourceDictionary.MergedDictionaries>         
 </ResourceDictionary>     
</Application.Resources> 
...