Подтвердить что ты не робот

Разница между стилем и контрольной таблицей

Не могли бы вы рассказать мне, какие основные отличия между Style и ControlTemplate? Когда или почему использовать тот или иной?

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

4b9b3361

Ответ 1

В стиле, заданном свойствами элемента управления.

<Style x:Key="MyButtonStyle" TargetType="Button">
    <Setter Property="Background" Value="Red"/>
</Style>

<Button Style="{StaticResource MyButtonStyle}"/>

Все кнопки, которые используют этот стиль, будут иметь свои фоны, установленные на красный.

В шаблоне вы определяете UI (структуру) элемента управления.

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="Green"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>

<Button Template="{StaticResource MyButtonTemplate}"/>

Все кнопки, которые используют этот шаблон, будут иметь зеленый фон, который нельзя изменить.

Значения, установленные в шаблоне, могут быть заменены только заменой всего шаблона. Значения в стиле можно заменить установкой значения явно при использовании элемента управления. Поэтому лучше использовать свойства элемента управления, используя TemplateBinding вместо значений кодирования.

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="{TemplateBinding Background}"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>

Теперь шаблон использует значение свойства Background для кнопки, к которой он применяется, поэтому его можно настроить:

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/>

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

Просто удалите атрибут x: Key стиля (опять же: вы не можете сделать это с помощью шаблонов). Все кнопки в визуальном дереве ниже стиля будут применены в этом стиле.

Совмещение шаблонов и стилей является дополнительным: вы можете установить свойство Template в стиле:

<Style TargetType="Button">
    <Setter Property="Background" Value="Red"/>
    <Setter Property="Template">
        <Setter.Value>
             <ControlTemplate TargetType="Button">
                 <Grid>
                     <Rectangle Fill="{TemplateBinding Background"/>
                     <ContentPresenter/>
                 </Grid>
             </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Ответ 2

Нет, вы совсем не правы. Стили задают свойства на элементах управления. ControlTemplate - это свойство, совместно используемое большинством элементов управления, которые определяют, как они отображаются.

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

Шаблоны управления могут быть заданы стилем или явно заданы для элемента управления, чтобы изменить способ его отображения. Все элементы управления имеют шаблоны по умолчанию (и стили, если на то пошло), встроенные в сборки .net wpf. Понятно, что они понимают и понимают, как разработчики wpf реализовали обычные версии всех элементов управления. Если у вас установлена ​​смесь Expression, загляните в ее папку "SystemThemes".

UPDATE:

Чтобы понять, как Styles и ControlTemplates могут "добавлять элементы управления". Так или иначе, ControlTemplate - это единственный способ определить элементы управления, состоящие из. Но некоторые элементы управления по умолчанию .net позволяют вам использовать элементы управления вместо текста.

Например:

<GroupBox>
  <GroupBox.Header>
    <CheckBox/>
  </GroupBox.Header>
</GroupBox>

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

Однако иногда элемент управления ControlTemplate по умолчанию не позволяет вам изменять то, что вы хотите изменить с помощью свойств. Затем вы должны изменить ControlTemplate.

Если вы задаете свойства элемента управления (Content, Header, ControlTemplate, IsEnabled и т.д.) напрямую или через стиль, не имеет значения, стили - это только удобство.

Надеюсь, это более четко ответит на ваш вопрос.

Ответ 3

Вы можете придумать стиль как удобный способ применить набор значений свойств к нескольким элементам. Вы можете изменить внешний вид по умолчанию, установив свойства, такие как FontSize и FontFamily, на каждый элемент TextBlock. Однако, если вы хотите, чтобы ваши элементы TextBlock делились некоторыми свойствами, вы можете создать раздел "Стиль в ресурсах" вашего файла XAML.

С другой стороны, ControlTemplate указывает визуальную структуру и визуальное поведение элемента управления. Вы можете настроить внешний вид элемента управления, предоставив ему новый элемент ControlTemplate. Когда вы создаете ControlTemplate, вы заменяете внешний вид существующего элемента управления без изменения его функциональности. Например, вы можете сделать кнопки в своем приложении круглыми, а не квадратную форму по умолчанию, но кнопка все равно будет поднимать событие Click.

Ссылка: http://msdn.microsoft.com/en-us/library/ms745683.aspx

Ответ 4

Я нашел некоторые интересные различия в  Разница между стилями и шаблонами (msdn)

Стиль: Вы можете установить только ранее существовавшие свойства в стиле. Например, вы не можете установить значение по умолчанию для свойства, которое принадлежит новой части, добавленной в шаблон.

Шаблон: При изменении шаблона у вас есть доступ к большему количеству элементов управления, чем при изменении стиля. Например, вы можете изменить способ отображения всплывающего списка в комбинированном поле или изменить внешний вид кнопки, которая запускает всплывающий список в поле со списком, изменяя шаблон элементов.


Стиль: Вы можете использовать стили для указания поведения элемента управления по умолчанию. Например, в стиле для кнопки вы можете указать триггер, чтобы при перемещении указателя мыши над кнопкой цвет фона изменился. Эти изменения свойств мгновенно (они не могут быть анимированы постепенно).

Шаблон: Вы можете указать поведение любых новых и существующих частей в шаблоне с помощью триггеров. Например, вы можете указать триггер, чтобы при перемещении указателя мыши над кнопкой цвет одной из частей изменился. Эти изменения свойств могут быть мгновенными или анимированными постепенно, чтобы обеспечить плавный переход.

Ответ 5

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

Стиль более гибкий, чем ControlTemplate.

От Windows Presentation Foundation Unleashed, Адам Натан и банда (писатели) заявляют об этом:

  • "Помимо удобства сочетания шаблона [со стилем, использующим setTypeplate StyleThereplate] с произвольными настройками свойств, есть важные преимущества этого [установка SetToolTramplate в стиле]:

    • Он дает вам эффект шаблонов по умолчанию. Например, когда типизированный стиль применяется к элементам по умолчанию и этот стиль содержит настраиваемый шаблон управления, шаблон управления применяется без каких-либо явных обозначений этих элементов.
    • Он позволяет вам предоставить по умолчанию все еще переопределяемый valus свойства, которые контролируют внешний вид шаблона. Другими словами, это позволяет вам уважать шаблонные родительские свойства, но при этом предоставлять свои собственные значения по умолчанию.

Другими словами, создание стиля позволяет пользователю установщика шаблона стиля переопределять установленные значения, даже если они не использовали TemplateBinding ({TemplateBinding Width}, например). Если вы жестко закодировали Width в своем стиле, пользователь стиля все равно может переопределить его, но если вы жестко закодировали это свойство Width в шаблоне, пользователь застрял с ним.

Кроме того, (и это довольно запутанно) при использовании ContentTemplate с TemplateBinding, он обязан пользователю установить это свойство, иначе он будет использовать свойство по умолчанию для TargetType. Если вы используете стиль, вы можете переопределить свойство по умолчанию TargetType, используя средство setter для этого свойства, а затем применить TemplateBinding, ссылаясь на этот установщик. В книге объясняется это лучше, стр. 338 (Смешивание шаблонов со стилями)