하나의 XAML 스타일에 대해 여러 대상 유형을 정의 할 수 있습니까?

StackOverflow https://stackoverflow.com/questions/802658

  •  03-07-2019
  •  | 
  •  

문제

HTML/CSS에서는 여러 유형의 요소에 적용될 수있는 스타일을 정의 할 수 있습니다.

.highlight {
    color:red;
}

P 및 DIV에 모두 적용 할 수 있습니다.

<p class="highlight">this will be highlighted</p>
<div class="highlight">this will also be highlighted</div>

그러나 XAML에서는 스타일에 대한 TargetType를 정의 해야하는 것 같습니다. 그렇지 않으면 오류가 발생합니다.

<Style x:Key="formRowLabel" TargetType="TextBlock">

XAML 스타일을 여러 요소에 적용하거나 CSS에서와 같이 열어 두는 방법이 있습니까?

도움이 되었습니까?

해결책

WPF 스타일의 세터는 컴파일 시간 동안 점검됩니다. CSS 스타일은 동적으로 적용됩니다.

WPF가 해당 유형의 종속성 속성으로 세터의 속성을 해결할 수 있도록 유형을 지정해야합니다.

원하는 속성을 포함하는 대상 유형을 기본 클래스로 설정 한 다음 해당 스타일을 파생 클래스에 적용 할 수 있습니다. 예를 들어, 제어 객체에 대한 스타일을 만들고 여러 유형의 컨트롤 (버튼, 텍스트 상자, 확인란 등)에 적용 할 수 있습니다.

<Style x:Key="Highlight" TargetType="{x:Type Control}">
    <Setter Property="Foreground" Value="Red"/>
</Style>

...

<Button Style="{StaticResource Highlight}" Content="Test"/>
<TextBox Style="{StaticResource Highlight}" Text="Test"/>
<CheckBox Style="{StaticResource Highlight}" Content="Test"/>

다른 팁

<!-- Header text style -->
<Style x:Key="headerTextStyle">
    <Setter Property="Label.VerticalAlignment" Value="Center"></Setter>
    <Setter Property="Label.FontFamily" Value="Trebuchet MS"></Setter>
    <Setter Property="Label.FontWeight" Value="Bold"></Setter>
    <Setter Property="Label.FontSize" Value="18"></Setter>
    <Setter Property="Label.Foreground" Value="#0066cc"></Setter>
</Style>

<!-- Label style -->
<Style x:Key="labelStyle" TargetType="{x:Type Label}">
    <Setter Property="VerticalAlignment" Value="Top" />
    <Setter Property="HorizontalAlignment" Value="Left" />
    <Setter Property="FontWeight" Value="Bold" />
    <Setter Property="Margin" Value="0,0,0,5" />
</Style>

스타일을 선언하는이 두 가지 방법이 귀하의 질문에 답할 수 있다고 생각합니다. 첫 번째에는 대상 유형이 지정되지 않았지만 속성 이름은 '레이블'으로 접두사가 있습니다. 두 번째로, 스타일은 레이블 객체를 위해 만들어집니다.

이를 수행하는 또 다른 방법은 다음과 같습니다.

<UserControl.Resources>
  <Style x:Key="commonStyle" TargetType="Control">
     <Setter Property="FontSize" Value="24"/>
  </Style>
  <Style BasedOn="{StaticResource commonStyle}" TargetType="ListBox"/>
  <Style BasedOn="{StaticResource commonStyle}" TargetType="ComboBox"/>
</UserControl.Resources>

텍스트 블록에 스타일을 적용하고 텍스트 상자에 적용하고 싶었지만 텍스트 블록이 제어에서 상속되지 않기 때문에 선택한 답변은 나에게 효과가 없었습니다.

<Style x:Key="ShowIfRequiredStyle" TargetType="{x:Type FrameworkElement}">
        <Setter Property="Visibility" Value="Collapsed"/>
        <Style.Triggers>
            <DataTrigger Binding="{Binding ShowIfRequiredStyle, UpdateSourceTrigger=PropertyChanged}" Value="true">
                <Setter Property="Visibility" Value="Visible"/>
            </DataTrigger>
        </Style.Triggers>
</Style>

<TextBlock Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>
<TextBox Style="{StaticResource ResourceKey=ShowIfRequiredStyle}"/>

이것은 가시성 속성에 대해 작동합니다. 두 항목 모두 프레임 워크 레미션에서 상속되고 속성이 정의되어 있기 때문입니다. 물론 이것은 제어에만 정의 된 속성에 대해서는 작동하지 않습니다. 계층 구조 트리를 검색하고 기본 클래스를 찾으려고 노력할 수 있습니다.

질문에 대한 대안이 있습니다. TargetType 매개 변수를 스타일을 완전히 벗어날 수있어 다양한 컨트롤에 적용 할 수 있지만 속성 이름을 "Control"으로 접두사 한 경우에만 가능합니다.

<Style x:Key="Highlight">
    <Setter Property="Control.Foreground" Value="Red"/> 
</Style> 

분명히, 이것은 기본 제어 클래스의 속성에만 적용됩니다. ItemsSource Say를 설정하려고하면 컨트롤이 없기 때문에 실패 할 것입니다.

나는 이것을 일했다

<Style x:Key="HeaderStyleThin"  TargetType="{x:Type Border}">
    <Setter Property="Background" Value="Black" />

    <Style.Resources>
        <Style TargetType="{x:Type TextBlock}">
               <Setter Property="Background=" Value="Red" />
        </Style>
        </Style.Resources>

</Style>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top