2011-01-11 6 views
3

Я пытаюсь переопределить стиль по умолчанию базового элемента управления (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, у меня нет проблем, но я хочу, чтобы этот стиль был зависимым от темы. Кстати, он хорошо работает с моими собственными пользователями.

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

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

Thanks

+0

Можете ли вы включить код app.xaml? – bendewey

+0

David

ответ

1

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

<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> 

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

+0

Я ссылался на файл темы из aero-dll (см. Комментарий перед этим). Я изменил файл assemblyinfo следующим образом: поэтому wpf будет использовать мой расширенные тематические файлы (classic.xaml, aero.normalcolor.xaml, luna.metallic.xaml, ...) – David

1

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

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

1

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

Я написал статью в блоге об этом «длинный» время назад, он объясняет, что делать:

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

Хитрость заключается в том, чтобы определить стиль в том же словаре ресурсов с ключом " DefaultTextBoxStyle ", а затем программно добавить стили с правой клавишей (" {x: Тип TextBox} "на основной ресурс приложения. Таким образом, вы избегаете циклических ссылок.

+0

Я уже видел ваш большой блог. Поскольку я застрял на стороне xaml, я дам stylehelper class a go. – David

+0

Просто сообщите нам, если yo Вам нужна дополнительная помощь. –

+0

Ваша ссылка сломана. Я нашел правильный URL (http://geertvanhorrik.com/2009/07/20/override-or-customize-wpf-themes-such-as-presentationframework-aero/), но zip-файл также 404-х. – yourbuddypal

Смежные вопросы