2012-05-07 2 views
2

Я пытаюсь написать повторно используемый шаблон для WPF ItemContainerStyle.Как передать свойства WPF Style

Этот шаблон изменяет способ отображения элемента TabControl. Этот шаблон предназначен для использования в нескольких местах приложения.

В каждом месте оно используется. Я хочу иметь возможность передавать ему различные параметры. Например: для изменения отступа от границы Пункт:

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

       <Setter Property="Margin" Value="10,0"/> 

       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type TabItem}"> 
          <Grid SnapsToDevicePixels="true"> 
           <Border x:Name="Bd" Width="80" 
            Background="Gray" 
            Margin="{TemplateBinding Margin}"> 
            <ContentPresenter x:Name="Content" 
             ContentSource="Header" /> 
           </Border> 
          </Grid> 
          <ControlTemplate.Triggers> 
          </ControlTemplate.Triggers> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Style> 
... 
<TabControl ItemContainerStyle="{DynamicResource TabItemStyle1}"> 

В том месте, где используется этот стиль, я хотел бы написать что-то вроде:

ItemContainerStyle="{DynamicResource TabItemStyle1 Margin='5,0'}" 

или

<TabControl Margin="78,51,167,90" ItemContainerStyle="{DynamicResource TabItemStyle1}" 
      ItemContainerStyle.Margin="5,0"> 

Мотивация заключается в использовании этого шаблона в разных местах с разными полями. Есть ли способ сделать это?

Спасибо

ответ

2

ОК, я нашел способ сделать это с Помощь Дэйва.

Решение состоит в том, чтобы создать производный шаблон и установить в нем свойства. Таким образом, исходный шаблон можно использовать повторно.

<Style x:Key="TabItemStyle2" TargetType="{x:Type TabItem}" 
    BasedOn="{StaticResource TabItemStyle1}"> 
    <Style.Setters> 
     <Setter Property="Margin" Value="40,0"></Setter> 
    </Style.Setters> 
</Style> 

И установить ItemContainerStyle в TabControl к производному стилю:

<TabControl ItemContainerStyle="{DynamicResource TabItemStyle2}"> 
0

способ ее решения, добавляя свойство Margin к объектам/ViewModels вы хотите отобразить и (данные) связываются с этим значением в шаблоне.

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

4

Вы можете сделать это с прикрепленными свойствами. Я написал сообщение в блоге объясняет, как это сделать:

http://www.thomaslevesque.com/2011/10/01/wpf-creating-parameterized-styles-with-attached-properties/

Другой вариант заключается в использовании DynamicResource и переопределить ресурс в производных стилей

+0

спасибо Thomas, ваш первый ответ ясный и элегантный. Однако я хотел, чтобы это можно было сделать без написания дополнительного кода на C#. Мой ответ выше делает это, но опять же - писать небольшой статический класс не имеет большого значения, и он может быть еще более изящным. Спасибо. –

+0

Кстати, в моем ответе (выше) используются статические свойства. –

3

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

Однако в базовом стиле можно определить ресурсы и переопределить эти значения в производных определениях.Итак, с оригинальным примером это будет выглядеть так:

<Style x:Key="AbsTabItemStyle" TargetType="{x:Type TabItem}"> 
    <!-- Override these default values in derived style definitions --> 
    <Style.Resources> 
     <s:Double x:Key="GridBorderMargin">10</s:Double> 
     <Color x:Key="GridBorderColor">Grey</Color> 
    </Style.Resources> 

    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type TabItem}"> 
       <Grid SnapsToDevicePixels="true"> 
        <Border x:Name="Bd" 
          Width="80" 
          Background="{DynamicResouces GridBorderColor}" 
          Margin="{DynamicResouces GridBorderMargin}" 
          > 
         <ContentPresenter x:Name="Content" 
          ContentSource="Header" /> 
        </Border> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

<Style x:Key="BigMarginTabItemStyle" TargetType="{x:Type TabItem}" BasedOn="{StaticResource AbsTabItemStyle}"> 
    <!-- Set different values in this derived style definition --> 
    <Style.Resources> 
     <s:Double x:Key="GridBorderMargin">20</s:Double> 
    </Style.Resources> 
</Style> 

<Style x:Key="RedTabItemStyle" TargetType="{x:Type TabItem}" BasedOn="{StaticResource AbsTabItemStyle}"> 
    <!-- Set different values in this derived style definition --> 
    <Style.Resources> 
     <c:Color x:Key="GridBorderColor">Red</Color> 
    </Style.Resources> 
</Style>