Как определить ресурсы и MergeDictionary с ключом на странице SL4 - PullRequest
9 голосов
/ 29 сентября 2010

Это, вероятно, действительно глупый вопрос, но я не могу понять это.

У меня есть страница с определенным MergeDictionary:

  <navigation:Page.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </navigation:Page.Resources>

, и я ссылаюсь на стили в TourneySetupStyles.xaml в моем XAML, как это без проблем:

<TextBlock Text="Tourney Name:" Style="{StaticResource TourneySetupTextStyle}" />

Однако теперь мне нужно добавить еще один ресурс страницы, как это:

Но дизайнер теперь бросаетпредупреждение: «Конструктор не поддерживает загрузку словарей, которые смешивают элементы« ResourceDictionary »без ключа и другие элементы в одной коллекции. Убедитесь, что свойство« Ресурсы »не содержит элементов« ResourceDictionary »без ключа или чтоЭлемент «ResourceDictionary» является единственным элементом в коллекции. "

Поэтому я добавляю ключ к своему ResourceDictionary следующим образом:

   <navigation:Page.Resources>
         <local:Tournament x:Key="tournament" />
        <ResourceDictionary x:Key="whatever">
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>

    </navigation:Page.Resources>

, и предупреждение исчезает.НО теперь моя ссылка на стиль в TourneySetupStyles больше не работает:

"Не удается найти ресурс с именем / ключом TourneySetupTextStyle"

Поэтому я предполагаю, что вопрос заключается в следующем: как получить доступ к стилютеперь, когда ResourceDictionary имеет ключ?

Ответы [ 4 ]

8 голосов
/ 29 сентября 2010

Я только что столкнулся с этим сегодня - я кросс-компиляция в WPF / Silverlight. Поместите локальный ресурс в узел ResourceDictionary, не помещайте ключ x: Key в узел ResourceDictionary.

<UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/mydll;component/folder/MyResDict.xaml" />
        </ResourceDictionary.MergedDictionaries>

        <LinearGradientBrush x:Key="OrangeGradient"
                             EndPoint="0.5,1"
                             MappingMode="RelativeToBoundingBox"
                             StartPoint="0.5,0">
            <LinearGradientBrush.RelativeTransform>
                <RotateTransform  CenterY="0.5"
                                  CenterX="0.5" />
            </LinearGradientBrush.RelativeTransform>
            <GradientStop Color="#FFF3801E" />
            <GradientStop Color="#FFEDB17E"
                          Offset="0.5" />
            <GradientStop Color="#FFF3801E"
                          Offset="1" />
        </LinearGradientBrush>
    </ResourceDictionary>
</UserControl.Resources>

Я не могу объяснить, почему - но я знаю, что это работает ...

НТН

1 голос
/ 29 сентября 2010

вздох кажется, что порядок объявлений важен, как только я перемещаю первый ресурс вниз, он теперь работает:

<navigation:Page.Resources>
    <ResourceDictionary x:Key="TourneySetupStyles">
            <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="../Assets/TourneySetupStyles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    <local:Tournament x:Key="tourneySetupViewModel" />
</navigation:Page.Resources>

Если кто-нибудь может объяснить, почему это будетотлично подойдет для дальнейшего использования ...

0 голосов
/ 21 февраля 2013

Да, меня это укусило. Как только Silverlight загружает словарь объединенных ресурсов, он удаляет все локальные ресурсы, которые вы уже добавили! В моем случае мне нужно программно добавить ресурс перед вызовом InitalizeComponent (), но поскольку UserControl включает объединенный ResourceDictionary, этот ресурс теряется. ИМХО это ошибка в Silverlight.

Но размещение локальных ресурсов после ResourceDictionary будет работать для таких случаев, как ваш, поэтому я проголосовал за это.

0 голосов
/ 25 декабря 2010

Я столкнулся с той же проблемой.

Я решил проблему, указав слияние моего словаря в файле xaml приложения вместо самого представления.

Ex:

    <ResourceDictionary>

        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="Resources\Brushes\Brushes_Dictionary.xaml" />
            <ResourceDictionary Source="Resources\Storyboards\Storyboard_Dictionary.xaml" />
        </ResourceDictionary.MergedDictionaries>

    </ResourceDictionary>

</Application.Resources>

...