среда, 14 октября 2015 г.

Неверное отображение WPF программы в классической теме оформления Windows

Иногда при разработке на C# использованием WPF возникает проблема с отображением окон, особенно если используются не стандартные компоненты, а какие нибудь свои, либо измененные стандартные. Для примера создадим окно с одним TabControl`ом и парой TabItem`ов. Добавим кнопки и пару элементов. Окно при использовании стандартной темы Windows 7

При использовании темы Aero все будет выглядеть вполне нормально, но если мы запустим программу при использовании темы Classic (к примеру на почти всех серверных ОC тема по умолчанию именно классическая), то отображение будет не очень корректным -

Для исправления данной проблемы сделаем следующее -
В References добавим ссылку на PresentationFramework.Aero и добавим следующий код -

    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="/PresentationFramework.Aero;V3.0.0.0;31bf3856ad364e35;component/themes/aero.normalcolor.xaml" />
    </ResourceDictionary.MergedDictionaries>

Обычно этого достаточно, но если у вас используется директива Style и вы забыли (или не стали определять директиву BasedOn) то будет выглядеть в классической вот так -

У вас в таком случае два выхода -
1. В файле где у вас определены стили нужно немного их переписать -
если было - <Style x:Key="TabItemStyle" TargetType="TabItem">
Надо добавить директиву BasedOn
 <Style x:Key="TabItemStyle" TargetType="TabItem" BasedOn="{StaticResource {x:Type TabItem}}">
2. Либо полностью прописать нужный стиль, как должны выглядить элементы.

Теперь программа выглядит корректно при любой теме.