Применяйте темы к wpf и используйте стили - PullRequest
0 голосов
/ 13 декабря 2011

Я пытаюсь применить тему к куче проектов wpf. Существует одна сборка, содержащая generic.xaml и различные приложения. Насколько я понимаю, я не могу использовать атрибут ThemeInfo с ResourceDictionaryLocation.ExternalLocation, поскольку имя должно совпадать с именем моей программы, но у меня более одной программы ...

Так что я искал и обнаружил, что мне нужно только включить словарь как MergedDictionary в app.xaml

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/ClassLibrary1;component/Themes/generic.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Это в основном работает. Но если я использую стиль для элементов управления, он больше не будет применять стиль generic.xaml:

generic.xaml в ClassLibrary1.dll

<ResourceDictionary x:Class="ClassLibrary1.Themes.generic"
                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="Black" />
</Style>

Окно в программе

<Window x:Class="Theming.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">

    <Window.Resources>
        <Style TargetType="Button"
               x:Key="ButtonGreenTextStyle">
            <Setter Property="Foreground"
                    Value="Green" />
        </Style>
    </Window.Resources>

    <Grid>
        <Button Style="{DynamicResource ButtonGreenTextStyle}" Content="Test" />
    </Grid>
</Window>

Что мне нужно сделать, так это то, что WPF будет понимать стиль в моем generic.xaml как базовый стиль для всех кнопок (я знаю, что мне также придется написать ControlTemplate; приведенный выше код просто для простоты)

Ответы [ 2 ]

0 голосов
/ 17 января 2012

Я нашел другое решение. Вы должны написать стили на основе пользовательской разметки:

Это будет применять текущий стиль темы. Код для этого MarkupExtension можно найти здесь:

Как изменить стиль кнопки по умолчанию без возврата WPF с Aero на Classic?

0 голосов
/ 13 декабря 2011

Я бы попробовал две вещи

  • Создайте общий ButtonBase стиль / шаблон, чтобы настроить внешний вид всех кнопки
  • Попробуйте использовать атрибут BasedOn в ButtonGreeTextStyle, основываясь на существующем стиле.
...