programing

WPF에서 내포된 요소 스타일 지정

i4 2023. 5. 11. 21:05
반응형

WPF에서 내포된 요소 스타일 지정

중첩된 요소 구조가 있다고 가정합니다. 예를 들어, 메뉴 항목이 있는 상황별 메뉴:

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

상황에 맞는 메뉴 또는 메뉴 항목 요소에 스타일 또는 템플리트를 쉽게 적용할 수 있습니다.그러나 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>

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

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

이 스타일은 컨텍스트 메뉴 내의 모든 MenuItem 개체에 적용됩니다.

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

제가 이 작업을 수행한 방법은 를 사용하여 ResourceDictionary 글로벌 리소스 사전 내에서 상위 요소에만 적용합니다.

내부 앱.xaml:

<Application.Resources>
  <ResourceDictionary>
    ...

    <ResourceDictionary x:Key="menuChildrenStyles">
      <Style TargetType="MenuItem">
        <!--Setters-->
      </Style>
    </ResourceDictionary>

    ...
  </ResourceDictionary>
</Application.Resources>

그런 다음 다른 xaml 보기 내부:

<ContextMenu Resources="{StaticResource menuChildrenStyles}">
  <MenuItem />
  <MenuItem />
  <MenuItem />
  <MenuItem />
</ContextMenu>

이것은 적용될 것입니다.MenuItem누구에게나 어울리는 스타일MenuItem요소가 상위 요소 내부에 있습니다.

다음과 같이 "menuChildrenStyles" 사전에 추가 스타일을 추가할 수도 있습니다.TextBlock,기타.

언급URL : https://stackoverflow.com/questions/666269/styling-nested-elements-in-wpf

반응형