Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: ArmentageОтветов: 2

Как изменить представление 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 в моем случае).

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

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

wpfxamlstyles

Ответы

Ответ 1 · рейтинг 3 · Armentage

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

http://wpfthemereplacer.codeplex.com/

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

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

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

Ответ 2 · H.B.

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

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы