Зачем определять шаблон внутри стиля в xaml, WPF? - PullRequest
8 голосов
/ 02 февраля 2011

Мне было интересно это с тех пор, как я начал использовать примеры шаблонов элементов управления MS в качестве основы для создания пользовательских элементов управления.

возьмите пример Label, например: http://msdn.microsoft.com/en-us/library/ms752327.aspx

с какой стати это определяется так:

<Style x:Key="{x:Type Label}" TargetType="Label">
  <Setter Property="HorizontalContentAlignment" Value="Left" />
  <Setter Property="VerticalContentAlignment" Value="Top" />
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="Label">
        <Border>
          <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                            VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                            RecognizesAccessKey="True" />
        </Border>
        <ControlTemplate.Triggers>
          <Trigger Property="IsEnabled" Value="false">
            <Setter Property="Foreground">
              <Setter.Value>
                <SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" />
              </Setter.Value>
            </Setter>
          </Trigger>
        </ControlTemplate.Triggers>
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

и не так напрямую:

<ControlTemplate x:Key="{x:Type Label}" TargetType="Label">
    <Border>
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                        RecognizesAccessKey="True" />
    </Border>
    <ControlTemplate.Triggers>
      <Trigger Property="IsEnabled" Value="false">
        <Setter Property="Foreground">
          <Setter.Value>
            <SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" />
          </Setter.Value>
        </Setter>
      </Trigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

а затем вызывается как шаблон напрямую, а не через свойство style?

Есть ли скрытая причина, по которой я не вижу подобных вещей? или это всего лишь один из способов сделать что-то и все?

(NB: не говорите мне, что это из-за установки горизонтального и вертикального выравнивания! Мы все знаем, что это значения по умолчанию для метки, и это в принципе бесполезно, если вы сохраняете эти значения)

1 Ответ

8 голосов
/ 02 февраля 2011

Без использования Стиль невозможно автоматически назначить шаблон для всех экземпляров определенного типа элемента управления. Установка x:Key="{x:Type Label}" для шаблона элемента управления не автоматически применяет этот шаблон ко всем элементам управления типа Метка .

Вы можете применить стиль ко всем кнопкам ниже объявления в визуальном дереве, установив TargetType на Button, но вы не можете сделать то же самое с шаблоном, если вы не оберните его внутри Стиль с шаблоном для шаблона.

Также обратите внимание, что в вашем примере вы можете обменять

<Style x:Key="{x:Type Label}" TargetType="Label">

С

<Style TargetType="Label">

Поскольку x:Key установлено в TargetType, если определение x:Key опущено.

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