Как основать стиль на другом стиле в словаре ресурсов? - PullRequest
19 голосов
/ 15 апреля 2011

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

<UserControl.Resources>
  <ResourceDictionary>
      <ResourceDictionary.MergedDictionaries>
          <ResourceDictionary Source="Theme.xaml"/>
      </ResourceDictionary.MergedDictionaries>

      <conv:ErrorContentConverter x:Key="ErrorContentConverter" />

      <Style x:Key="ValidTrigger" 
             TargetType="Control" BasedOn="{StaticResource {x:Type Control}}">
         <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsValid}" Value="False">
              <Setter Property="IsEnabled" Value="false" />
            </DataTrigger>
         </Style.Triggers>
      </Style>   
  </ResourceDictionary>
</UserControl.Resources>

Базовый шаблон:

    <Style TargetType="{x:Type Button}" BasedOn="{x:Null}">
    <Setter Property="FocusVisualStyle" 
            Value="{DynamicResource NuclearButtonFocusVisual}" />
    <Setter Property="Foreground" Value="#FF042271" />
    <Setter Property="FontFamily" Value="Trebuchet MS" />
    <Setter Property="FontSize" Value="12" />
    <Setter Property="Padding" Value="3" />

    <Setter Property="Template" Value="{DynamicResource ButtonTemplate}" />
</Style>

Ответы [ 4 ]

23 голосов
/ 14 октября 2013

Один прием, который я использовал в прошлом: в вашем ResourceDictionary, который определяет общие стили для вашего приложения, добавьте x:Key к стилю, от которого вы хотели бы унаследовать, вот так:

<Style TargetType="{x:Type Button}" x:Key="ButtonStyle">
  <!-- your style here -->
</Style>

Чтобы применить этот стиль ко всем элементам управления указанного типа (Button в этом примере) без необходимости явно устанавливать атрибут Style каждого Button, добавьте еще один стиль, который BasedOn этот стиль, но не нет ключа:

<Style TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonStyle}" />

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

18 голосов
/ 15 апреля 2011

Дайте вашему базовому стилю имя, скажем, FooStyle.

В приведенном вами примере измените TargetType и BasedOn, чтобы они выглядели следующим образом:

 <Style x:Key="ValidTrigger" 
        TargetType="{x:Type Control}" BasedOn="{StaticResource {x:Type Control}}" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=IsValid}" Value="False">
            <Setter Property="IsEnabled" Value="false" />
        </DataTrigger>
    </Style.Triggers>
</Style>
1 голос
/ 16 апреля 2011

Я думаю, что нет базового стиля, определенного для "контроля", так что ваш BasedOn="{StaticResource {x:Type Control}}" часть ничего не найдет.

Вы, вероятно, хотите изменить

<Style x:Key="ValidTrigger" TargetType="Control" BasedOn="{StaticResource {x:Type Control}}" >

до

<Style x:Key="ValidTrigger" TargetType="Button" BasedOn="{StaticResource {x:Type Button}}" >
0 голосов
/ 15 апреля 2011

StaticResource vs DynamicResource

Вы хотите использовать DynamicResource вместо StaticResource.Ваше приложение будет скомпилировано, а ресурс будет разрешен во время выполнения, а не во время компиляции.Раньше в прежние времена WPF у DynamicResource было больше затрат на производительность, но сейчас это, похоже, не проблема.Я имею в виду, черт возьми, Expression Blend написан на WPF и использует DynamicResources повсюду.


PS Имейте в виду, что если вы на самом деле не определите имя ресурса, ваше приложение все равно будет работать, но вВ вашем случае вам будет не хватать функциональности.:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...