WPF Замена и расширение стилей

Как изменить представление WPF о стиле по умолчанию для элемента управления? И почему это происходит в первую очередь? В приведенном ниже XAML я объявляю стиль для кнопки, а затем объявляю новый стиль, который переопределяет один из установщиков под названием «HugeBut». Я ожидал, что HugeBut неявно основан на моем новом безымянном стиле, но, по-видимому, это не так;

<Window.Resources>
  <Style TargetType="{x:Type Button}">
    <Setter Property="Foreground" Value="Black"/>
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type Button}">
          <Border Background="Red">
            <ContentPresenter/>
          </Border>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>

  <!-- badness -->
  <Style TargetType="{x:Type Button}" x:Key="HugeBut">
    <Setter Property="Foreground" Value="Yellow"/>
  </Style>

  <!-- works, but I do not want to explicitly set the based-on. -->
  <Style TargetType="{x:Type Button}" x:Key="HugeBut" BasedOn="{StaticResource {x:Type Button}}">
    <Setter Property="Foreground" Value="Yellow"/>
  </Style>
</Window.Resources>

<Button Content="Regular" />
<Button Content="huge!" Style="{StaticResource HugeBut}"/>

Вы могли бы ожидать две красные кнопки, одну с черным текстом и одну с желтым, но Style HugeBut наследует все значения, которые я не указал в моем безымянном стиле, из системной темы по умолчанию для кнопки (Aero в моем случае).

Что я могу сделать, чтобы изменить это поведение?


person Armentage    schedule 27.07.2011    source источник
comment
Огромный(т)?!! Я думаю, что вы должны указать на основе. Если нет, как он узнает, что этот стиль основан на каком-то другом?   -  person Vale    schedule 27.07.2011
comment
Мне, конечно, не нужно указывать на основе, когда я расширяю стиль элемента управления по умолчанию. Я хотел бы попасть в ситуацию, когда значения, к которым все остальное возвращается, полностью зависят от моего выбора и НИКОГДА не выбираются автоматически из стиля по умолчанию, если только я этого не захочу.   -  person Armentage    schedule 27.07.2011
comment
На самом деле все наоборот. Он ВСЕГДА извлекается из стиля по умолчанию, если вы не укажете какой-либо другой.   -  person Vale    schedule 28.07.2011


Ответы (2)


Оказывается, ответ здесь:

http://wpfthemereplacer.codeplex.com/

Из описания сайта:

Эта библиотека позволяет пользователям предоставлять свои собственные словари ресурсов для замены словарей темы по умолчанию, загружаемых WPF. Благодаря этому вам не нужно украшать пользовательские стили с помощью BasedOn="{StaticResource {x:Type ...}}", когда в вашем приложении используется ваша собственная тема. Это также делает так, что если у вас есть настраиваемые элементы управления, которые просто предоставляют расширенные возможности и не требуют замены стиля, вам не нужно определять новый стиль или переопределять DefaultStyleKey при создании пользовательского элемента управления.

Это именно то, что я ищу. Это позволит мне использовать стили в том виде, в каком они предназначены для использования в приложении, которое было значительно «пересмотрено», а не создавать темы, устанавливая глобальные стили (и затем заниматься отслеживанием фрагментов кода, которые отсутствуют). , или вообще не может справиться с этим из-за ошибок WPF и других ограничений)

person Armentage    schedule 28.07.2011

работает, но я не хочу явно устанавливать на основе.

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

person H.B.    schedule 27.07.2011
comment
Конструкция системы стилей заключается в том, что при отсутствии стиля на основе используется значение по умолчанию. Я хочу изменить то, что он выбирает по умолчанию, а не поведение тега на основе. - person Armentage; 29.07.2011