2012-05-07 4 views
2

WPF ItemContainerStyle에 대한 재사용 가능한 템플릿을 작성하려고합니다.WPF에 속성을 전달하는 방법

이 템플릿은 TabControl의 항목이 보이는 방식을 변경합니다. 이 템플릿은 응용 프로그램의 여러 위치에서 사용하기위한 것입니다.

각기 다른 매개 변수를 전달할 수 있기를 원합니다. 예를 들어 는 :

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

또는

<TabControl Margin="78,51,167,90" ItemContainerStyle="{DynamicResource TabItemStyle1}" 
      ItemContainerStyle.Margin="5,0"> 
: 스타일이 내가 좋아하는 무언가를 쓰시겠습니까 사용되는 장소에서

<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}"> 

: 항목의 테두리의 여백을 변경하려면

다른 여백으로이 템플릿을 사용하는 것이 동기입니다. 이렇게하는 방법이 있습니까?

당신에게

답변

2

확인에 자원을 재정의하는 것입니다, 내가 함께 할 수있는 방법을 발견했습니다 : 나는 그것을 수행하는 방법을 설명하는이 블로그 포스트를 작성 데이브의 도움.

해결 방법은 파생 된 템플릿을 만들고 속성을 설정하는 것입니다. 이렇게하면 원래 템플릿을 다시 사용할 수 있습니다.

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

그리고 파생 스타일에있는 TabControl의 ItemContainerStyle 설정 : 내 경우

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

당신이 표시하고 템플릿에 그 값 (데이터) 바인딩 할 개체/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> 
관련 문제