Проблема глобальных стилей WPF с .Net4 - PullRequest
6 голосов
/ 29 апреля 2010

Я только что изменил свое приложение 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!

1 Ответ

3 голосов
/ 29 апреля 2010

Я нахожу это очень странным. Это отлично работало в .Net3.5, и я не вижу причин, почему это не должно работать сейчас!

Я сообщил об этом как об ошибке в Microsoft. Вы можете просмотреть отчет об ошибке здесь . Когда они подтверждают файл, там также должен быть доступен исходный код для решения изолированной проблемы.

...