Я только что изменил свое приложение WPF с .Net3.5 на .Net4. Это привело к тому, что все мои глобальные стили перестали работать. Работали только стили, явно заданные с помощью ключа. Я провел некоторое исследование и выяснил, что вызывает это, и воспроизвел его в простом приложении.
У меня есть простое приложение WPF, содержащее только кнопку с текстом - без стиля или чего-либо еще. Я определяю стиль для всех кнопок в ResourceDictionary App.Xaml:
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Red"></Setter>
</Style>
Моя кнопка теперь красная - все хорошо. Теперь я перенесу это в отдельный ResourceDictionary в отдельном проекте. Здесь я хочу сохранить все мои общие стили. Кнопка все еще красная, и моя ссылка из App.xaml на SharedStyles.xaml выглядит следующим образом:
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/StyleLib;component/SharedStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
Теперь - я хочу, чтобы SharedStyles.xaml из StyleLib содержал все определенные определения стилей, поэтому я создаю новый файл в том же проекте под названием ButtonStyles.xaml и добавляю туда ресурс. На самом деле - я также добавляю другой стиль с ключом, который будет использоваться явно (технически я добавил это позже, так что это не имеет никакого отношения к возникающей проблеме).
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style TargetType="{x:Type Button}">
<Setter Property="Background" Value="Red"></Setter>
</Style>
<Style x:Key="Explicit" TargetType="{x:Type Button}">
<Setter Property="Background" Value="Blue"></Setter>
</Style>
</ResourceDictionary>
На ButtonStyles.xaml ссылается SharedStyles.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/StyleLib;component/ButtonStyles.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
Теперь - моя кнопка управления больше не стилизована. На самом деле - он все еще отображается как стиль в окне предварительного просмотра в VS2010, но когда я запускаю приложение, они не стилизуются. Если я явно ссылаюсь на стиль с ключом «Явный», они получают этот стиль - поэтому файл успешно включен.
Еще одна забавная вещь заключается в том, что если я сейчас добавлю другой стиль в SharedStyle.xaml - например, глобальный стиль для StackPanel (именно это я и пробовал) - тогда глобальный стиль внутри ButtonStyle.xaml волшебным образом начинает работать ..!
Теперь у меня вопрос: я делаю что-то не так или это звучит как ошибка в .Net4? Звучит как ошибка для меня .. Это отлично работало в .Net3.5!