Динамические ресурсы в призме

Я не могу заставить стиль кнопок работать в приложении Prism 4.0 с четырьмя модулями. Вот элемент button из файла представления xaml в Module2:

<Button Name="add" Width ="60" Style="{DynamicResource Red}"  Click="add_Click"> Add</Button>

Приложение собирается и запускается, но цвет кнопки не отображается. Я определил стиль в файле Generic.xaml в папке Темы модуля Shell. Предполагается, что именно там можно разместить стили для совместного использования между модулями. В файле Generic.xaml у меня есть:

<ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:Shell.Controls" 
    xmlns:wc="clr-namespace:System.Windows.Controls;assembly=PresentationFramework">

 <Style 
   x:Key="{ComponentResourceKey 
    TypeInTargetAssembly={x:Type wc:Button},
    ResourceId=Red}"
    TargetType="wc:Button">
    <Setter Property="Foreground" Value="Red" />
  </Style>
</ResourceDictionary>

У меня также есть необходимая ссылка в файле AssemblyInfo.cs в папке Properties проекта Shell. Это должно заставить приложение Prism разрешить все ссылки на стили из файла Prism Generic.xaml:

[assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]

Это все еще оригинальные настройки, предоставленные шаблоном Prism WPF Unity, с которого я начинал, предоставленный блогом Дэвида Хилла [http://blogs.msdn.com/b/dphill/archive/2011/01/16/prism- 4-0-template-pack-now-available.aspx]. Шаблон поставляется с некоторыми стилями, уже имеющимися в Generic.xaml, но голое шаблонное приложение использует эти стили только для элементов управления в сборке оболочки, поэтому параметры "None" и "SourceAssembly" показаны выше.

Поскольку я пытаюсь определить стили для использования в модулях, отличных от модуля Shell, я добавил следующий атрибут ThemeInfo в AssemblyInfo.cs для Module1 и Module2L

[`assembly: ThemeInfo(ResourceDictionaryLocation.ExternalAssembly, ResourceDictionaryLocation.ExternalAssembly)]`

Я пытался добавить расширение ThemeDictionary в App.xaml, как это в App.xaml и безрезультатно.

    <Application.Resources>
    <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="{ThemeDictionary MyApp}"/>
    </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    </Application.Resources>

Также попробовал URL-адрес пакета в App.xaml и получил ошибку "Не удается найти ресурс".

    <Application.Resources>
    <ResourceDictionary>
    <ResourceDictionary.MergedDictionaries>
    <ResourceDictionary Source="pack://application:,,,/MyApp;Shell/Themes/Generic.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
    </Application.Resources>

Есть мысли или идеи по поводу того, чего не хватает? Спасибо.

1 ответ

Решение

ОБНОВЛЕНИЕ: Я получил ответ от Марка Родмана из Microsoft через службу технической поддержки. Два изменения:

Один был в Generic.xaml, изменив определение стиля на:

    <Style
x:Key="Red"
TargetType="Button">
    <Setter Property="Foreground" Value="Red" />
    </Style>

Другое изменение было в App.xaml:

  <Application.Resources>

    <ResourceDictionary
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
     <ResourceDictionary
Source="pack://application:,,,/Shell;component/Themes/Generic.xaml"/>
     </ResourceDictionary.MergedDictionaries>
     </ResourceDictionary>
    </Application.Resources>
Другие вопросы по тегам