developer tip

WPF에서 중첩 요소 스타일 지정

optionbox 2020. 12. 10. 19:52
반응형

WPF에서 중첩 요소 스타일 지정


예를 들어 MenuItems가있는 ContextMenu와 같은 중첩 된 요소 구조가 있다고 가정합니다.

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem Style="{StaticResource FooMenuItemStyle}"/>
    ...
</ContextMenu>

스타일이나 템플릿을 ContextMenu 또는 MenuItem 요소에 쉽게 적용 할 수 있습니다. 그러나 MenuItem 스타일이 Menu 스타일에 속하면 모든 MenuItem 요소에 추가하는 것이 매우 번거롭고 중복됩니다.

자동으로 자식 요소에 적용하는 방법이 있습니까? 다음과 같이 간단히 작성할 수 있습니다.

<ContextMenu Style="{StaticResource FooMenuStyle}">
    <MenuItem/>
    ...
</ContextMenu>

FooMenuStyle이 MenuItem 요소를 포함하는 스타일을 지정할 수 있다면 깔끔 할 수 있지만 불가능한 것 같습니다.

편집 : 내가 ItemContainerStyle을 알지 못했고 의도가 일반적인 솔루션을위한 것이기 때문에 메뉴 예제는 아마도 오해의 소지가 있습니다. 두 가지 답변을 바탕으로 일반적인 변형 하나와 ItemContainerStyle 등에 대한 두 가지 솔루션을 찾았습니다.

<Style x:Key="FooMenuItem" TargetType="{x:Type MenuItem}">
    ...
</Style>

<Style x:Key="FooMenu" TargetType="{x:Type ContextMenu}">
    <!-- Variant for specific style attribute -->
    <Setter Property="ItemContainerStyle"
            Value="{StaticResource FooMenuItem}"/>

    <!-- General variant -->
    <Style.Resources>
        <Style TargetType="{x:Type MenuItem}"
               BasedOn="{StaticResource FooMenuItem}"/>
    </Style.Resources>
</Style>

<ContextMenu Style="{StaticResource FooMenu}">
    <MenuItem/>
</ContextMenu>

<ContextMenu>
   <ContextMenu.Resources>
      <Style TargetType="{x:Type MenuItem}">
         <!--Setters-->
      </Style>
   </ContextMenu.Resources>
   <MenuItem/>
   <!--Other MenuItems-->
</ContextMenu>

스타일은 ContextMenu 내의 모든 MenuItem 개체에 적용됩니다.


원래 답변을 완성하기 위해 다음과 같이 부모 내부에 중첩 스타일을 추가하는 것이 더 명확하다고 생각합니다.

<Style x:Key="WindowHeader" TargetType="DockPanel" >
    <Setter Property="Background" Value="AntiqueWhite"></Setter>
    <Style.Resources>
        <Style TargetType="Image">
            <Setter Property="Margin" Value="6"></Setter>
            <Setter Property="Width" Value="36"></Setter>
            <Setter Property="Height" Value="36"></Setter>
        </Style>
        <Style TargetType="TextBlock">
            <Setter Property="TextWrapping" Value="Wrap"></Setter>
        </Style>
    </Style.Resources>
</Style>

<ContextMenu ItemContainerStyle="{StaticResource FooMenuItemStyle}">
    <MenuItem/>
</ContextMenu>

참고 URL : https://stackoverflow.com/questions/666269/styling-nested-elements-in-wpf

반응형