source

x:Key가 없는 글로벌 스타일을 재정의하거나 모든 유형 대상 컨트롤에 명명된 스타일을 적용하는 방법

manysource 2023. 4. 20. 21:36

x:Key가 없는 글로벌 스타일을 재정의하거나 모든 유형 대상 컨트롤에 명명된 스타일을 적용하는 방법

프로젝트의 모든 단추에 적용할 스타일을 선언했습니다. 이 스타일은 ResourceDictionary에 있습니다.

<Style TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>

일부 창에서는 이 스타일에서 상속하지만 값을 추가합니다.

<Style TargetType="StackPanel"> 
    <Setter Property="Margin" Value="5"/>
</Style>

문제는 글로벌 스타일에서 상속되지 않는다는 것입니다. 상속하려면 글로벌 스타일에 키를 할당해야 합니다.

<Style TargetType="StackPanel" x:Key="StackPanelStyle" />

그런 다음 창의 XAML 상속(또는 재정의 - 옵션)에서 다음을 수행합니다.

<Style TargetType="StackPanel" BasedOn="StackPanelStyle" />

문제는 키를 할당하면 글로벌하지 않고 각 창/스코프에서 호출해야 한다는 것입니다.

이 질문에 대한 해결책은 다음 두 가지 하나여야 합니다(그 밖에 놓치고 있는 것이 있습니까?).

  1. 전체 응용 프로그램의 모든 대상 컨트롤에 자동으로 적용되는 키가 있는 글로벌 스타일을 가질 수 있습니다.
  2. ResourceDictionary 수준의 이름 없는 스타일을 참조하고 재정의하는 방법입니다.

ResourceDictionary에서 실제로 작동하는 명명된 스타일 근처에 스타일을 재배치하는 것을 고려했습니다.

<!--In the ResourceDictionary-->
<Style x:Key="StackPanelStyle" TargetType="StackPanel">
    <Setter Property="Orientation" Value="Horizontal" />
    <Setter Property="VerticalAlignment" Value="Center"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
</Style>
<!--In the app.xaml-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/>
<!--In the window/page scope-->
<Style TargetType="StackPanel" BasedOn="{StaticResource StackPanelStyle}"/

하지만 난 멍청하게 모든 스타일을 다시 외치는 것보다 더 좋은 것을 찾고 있다.

이것을 시험해 보세요.

<Style TargetType="{x:Type StackPanel}" BasedOn="{StaticResource {x:Type StackPanel}}">
  <!-- ... -->
</Style>

App.xaml의 ResourceDictionary에서 기본 스타일을 선언했습니다.이렇게 특정 창에서 덮어쓰면 보통 동작합니다.

글로벌 리소스 사전에서 키로 기본 스타일을 정의합니다.이 기본 스타일은 해당 스타일을 적용하려는 모든 유형의 기본 유형을 대상으로 합니다.그런 다음 위에서 언급한 기본 스타일을 기반으로 원하는 유형을 대상으로 하는 스타일을 정의합니다.

<Style
    x:Key="upDownBaseStyle"
    TargetType="{x:Type Control}">
    <Setter
      Property="Margin"
      Value="2" />
    <Setter
      Property="HorizontalAlignment"
      Value="Stretch" />
    <Setter
      Property="VerticalAlignment"
      Value="Center" />
  </Style>

  <Style
    TargetType="{x:Type xceed:IntegerUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

  <Style
    TargetType="{x:Type xceed:DoubleUpDown}"
    BasedOn="{StaticResource upDownBaseStyle}">
  </Style>

이제 마지막 두 가지 스타일이 키에 대한 언급 없이 응용 프로그램 내의 모든 IntegerUpDown 및 DoubleUpDown 컨트롤에 적용됩니다.

따라서 기본 규칙: 기본 스타일에는 참조할 키가 있어야 하며, 파생된 스타일은 키 없이 대상 유형으로만 적용할 수 있습니다.

여기서 찾으시는 것은 일반적으로 사용자 컨트롤을 작성함으로써 실현되는 마스터 스타일 또는 동작 시나리오입니다.'글로벌' 스타일을 적용한 새 버튼 컨트롤을 만들려면 해당 컨트롤을 사용하는 모든 위치에서 '새로운 스타일'을 추가하거나 필요할 때 스타일을 재정의할 수 있습니다.

사용자 컨트롤을 생성하지 않은 경우 쉽게 구현할 수 있습니다.

언급URL : https://stackoverflow.com/questions/1303634/how-to-override-a-global-style-that-doesnt-have-an-xkey-or-alternatively-ap