2009-03-29 2 views
9

<Window.Resources>에서 나는 다음과 같은 스타일을 정의 :XAML에서 컨트롤에 선택적으로 영향을주는 스타일을 설정할 수 있습니까?

<Style x:Key="textBlockStyle" TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 

내가 네 TextBlocks이 일부 그리드를 정의 :

<WrapPanel> 
     <TextBlock Style="{StaticResource textBlockStyle}">Server</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">IP</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Port</TextBlock> 
     <TextBlock Style="{StaticResource textBlockStyle}">Status</TextBlock> 
    </WrapPanel> 

문제 : 내가 textBlockStyle 네 번을 참조 할 필요가있다.

질문 :WrapPanel 또는 그 스타일에 대한 참조를 반복하지 않고 해당 스타일을 한 번만 설정할 수 있습니까?

아마 뭔가 같은 :

<WrapPanel Style="{StaticResource textBlockStyle}"> 
     <TextBlock>Server</TextBlock> 
     <TextBlock>IP</TextBlock> 
     <TextBlock>Port</TextBlock> 
     <TextBlock>Status</TextBlock> 
    </WrapPanel> 

나는 글로벌 솔루션을 찾고 있지 않다! 내가 그 x:Key="textBlockStyle" 속성을 삭제할 수 있지만,이 창에있는 모든TextBlocks에 영향을 미칠 것입니다. 나는 선택적인 메커니즘이 필요하다. 그러나 그 추악한 코드 중복은 없다.

답변

17

당신은 확장 얼마나 잘 위해 여기에 제시된 몇 가지 옵션을 사용할 수 있습니다.

옵션 1 :

<WrapPanel> 
    <WrapPanel.Resources> 
     <Style TargetType="TextBlock"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </WrapPanel.Resources> 

    <!-- TextBlocks here --> 
</WrapPanel> 

주의 사항 : 그것은 단지 그 WrapPanel 내부 통제에 영향을 미치는 있도록이 WrapPanel 수준에서 리소스를 부착 할 수

낮은 수준에서 키없이 스타일을 정의 열쇠가 없다. 이 StyleWrapPanel 내의 모든 TextBlock들에 적용됩니다.

옵션 2 : 당신은 키와 높은 ​​수준의 Style, 당신은 다음없이 낮은 수준에서 다른 Style을 정의 할 수 있습니다 정의하면 낮은 수준

에서하지 않고 다시 키를 사용하여 스타일을 정의하고 상위 레벨 Style 하나에있는 키와베이스 :

<Window> 
    <Window.Resources> 
     <Style TargetType="TextBlock" x:Key="textBlockStyle"> 
      <Setter Property="Margin" Value="5,0,5,0"/> 
     </Style> 
    </Window.Resources> 

    <WrapPanel> 
     <WrapPanel.Resources> 
      <Style TargetType="TextBlock" BasedOn="{StaticResource textBlockStyle"/> 
     </WrapPanel.Resources> 

     <!-- TextBlocks here --> 
    </WrapPanel> 
</Window> 

이것은 Style 결과 자동 아니라 그 밖에 상기 WrapPanel 내부 TextBlock들에 적용된다. 또한, 당신은 Style의 세부 사항을 복제하지 않습니다 - 그들은 높은 수준에서 저장됩니다.

옵션 3 :

<!-- TextBlockStyles.xaml --> 
<ResourceDictionary> 
    <Style TargetType="TextBlock"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</ResourceDictionary> 

<!-- Window.xaml --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary> 
       <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="TextBlockStyles.xaml"/> 
       </ResourceDictionary.MergedDictionaries> 
      </ResourceDictionary> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 

<!-- Alternative Window.xaml if you have only one RD to merge in --> 
<Window> 
    <WrapPanel> 
     <WrapPanel.Resources> 
      <ResourceDictionary Source="TextBlockStyles.xaml"/> 
     </WrapPanel.Resources> 
    </WrapPanel> 
</Window> 
: 장소 선택적으로는 A ResourceDictionary에의 스타일과는 별도의 ResourceDictionaryStyle의를 배치하고 선택적으로 컨트롤의 Resources 모음으로 그 사전을 병합 할 수 있습니다,

마지막으로 병합

이제 원하는만큼 여러 개의 스타일 세트를 별도의 사전에 정의한 다음 선택적으로 요소 트리에 적용 할 수 있습니다.

+0

스타일을 이미 정의하고 다른 곳에서 사용하는 경우 대체로 옵션 2를 선호합니다. 그렇지 않은 경우 옵션 1. 위대한 대답은 켄트. –

2

네, 그렇게 할 수 있습니다. 거의 올바른 생각이 있습니다. 당신은 X 필요 없어요 : {유형 X} 구문 : 키를, 그것은 wrappanel의 모든 textblocks의 스타일을 설정합니다 당신은을 사용하여

<WrapPanel> 
< WrapPanel. Resources > 
<Style TargetType="{x:Type TextBlock}"> 
     <Setter Property="Margin" Value="5,0,5,0"/> 
    </Style> 
</WrapPanel.Resources/> 
     <TextBlock Server</TextBlock> 
     <TextBlock >IP</TextBlock> 
     <TextBlock >Port</TextBlock> 
     <TextBlock >Status</TextBlock> 
    </WrapPanel> 

.... 이런 식으로 그렇게. diff 스타일을 원하면 x : 키를 사용하고 텍스트 블록의 스타일을 명시 적으로 설정할 수 있습니다.

관련 문제