Как переопределить стиль в определенной теме - PullRequest
3 голосов
/ 11 января 2011

Я пытаюсь переопределить стиль по умолчанию базового элемента управления (TextBox, ComboBox) в файле темы. Как это:

в темах / classic.xaml

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Background" Value="Black"/>
</Style>

в темах / Aero.NormalColor.xaml

<Style TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Background" Value="Green"/>
</Style>

Но, похоже, это не работает. Я всегда получаю стиль по умолчанию без изменений. Я даже попробовал это с определенным ключом как

<Style x:Key="DefaultTextBoxStyle" TargetType="{x:Type TextBox}" BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Background" Value="Green"/>
</Style>

и всегда используйте этот ключ при объявлении элемента управления в xaml. Кажется, ничего не работает.

Если я добавлю стиль в файл application.xaml, у меня нет проблем, но я хочу, чтобы этот стиль зависел от темы. Кстати, это хорошо работает с моими собственными пользовательскими контролями.

Может кто-нибудь сказать мне, что я здесь не так делаю?

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

Спасибо

Ответы [ 3 ]

1 голос
/ 12 января 2011

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

Здесь - это тот, кто заставляет его работать статически, что, по-видимому, является тем, что вы хотите.

1 голос
/ 12 января 2011

Проблема в том, что вы получаете циклические ссылки. Это потому, что вы определяете стиль с классом XXX, но также используете тот же ресурс, что и базовый ресурс.

Я давно написал статью об этом в блоге, она объясняет, что делать:

http://blog.catenalogic.com/post/2009/07/20/Override-or-customize-WPF-themes-such-as-PresentationFrameworkAero.aspx

Задача состоит в том, чтобы определить стиль в том же словаре ресурсов с помощью ключа «DefaultTextBoxStyle», а затем программно добавить стили с помощью правого ключа («{x: Type TextBox}» к основному ресурсу приложения. Вы избегаете круговых ссылок.

1 голос
/ 11 января 2011

Вы ссылались на свою тему где-нибудь? например,

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="Test.App">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Simple Styles.xaml"/>
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>

Кроме того, не используйте x: Key в темах, если это не просто подстиль, на который ссылается другой стиль в теме.

...