Использование стилей в объединенных ResourceDictonaries в Silverlight 5

У меня в app.xaml есть куча стилей, и все они отлично используются на моих страницах в моем приложении SL5. Я хотел бы переместить эти стили в несколько словарей ресурсов, чтобы сделать их более управляемыми и удобными.

Сначала я скопировал стиль в новый словарь ресурсов на странице /Styles/ButtonStyles.xaml в моем проекте... фрагмент выглядит следующим образом:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <Style x:Key="RegistrationsRolloverImage" TargetType="Button">
    <Setter Property="Template">...</Setter>
  </Style>

  <Style x:Key="FinancialLedgerRolloverImage" TargetType="Button">
    <Setter Property="Template">...</Setter>
  </Style>

</ResourceDictionary>

Затем я добавил следующее в мой App.xaml:

<ResourceDictionary x:Key="MergedStyles">
  <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="Styles/ButtonStyles.xaml" />
  </ResourceDictionary.MergedDictionaries>
</ResourceDictionary>

Это заставило меня добавить a x:key к тегу ResourceDictionary, поскольку я продолжал получать ошибку сборки. Сейчас он строится, но кнопки, использующие стиль, не получают стиль. На самом деле я получаю сообщение об ошибке JS, что не удается найти стиль с именем двух стилей в моем словаре ресурсов. Они отлично работают, если они находятся в App.xaml, но не в отдельном словаре ресурсов. Я отразил сгенерированную DLL и могу увидеть styles/buttonstyles.xaml в DLL.

В недоумении... и не могу понять, что не так. Идеи?

2 ответа

Решение

В полном примере App.xaml вы хотите использовать "локальные" ресурсы. Но когда у вас есть "локальные" ресурсы и вы хотите объединить каталог ресурсов, systax немного отличается.

Попробуйте это так:

<Application ...>
  <Application.Resources>
    <ResourceDictionary>

      <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" />

      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Styles/ButtonStyles.xaml" />
      </ResourceDictionary.MergedDictionaries>

      <Style x:Key="BaseTextBlock" TargetType="TextBlock">
         ...
      </Style>

    </ResourceDictionary>
  </Application.Resources>
</Application>

Они находятся в одном проекте? Попробуйте что-то подобное в вашем app.xaml;

<Application.Resources>
   <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/YourResDictionaryContaining.Proj.Name;component/Styles/ButtonStyles.xaml" />
      </ResourceDictionary.MergedDictionaries>
   </ResourceDictionary>
</Application.Resources>

Я должен сделать это, чтобы консолидация ресурсов находилась в одном проекте, а затем добавить это в app.xaml каждого другого проекта, чтобы сделать их доступными глобально. В настоящее время я выполняю около 6 Resource Dicts по 20 проектам в одном и том же решении, и это прекрасно работает.

Другие вопросы по тегам