prosource

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

probook 2023. 4. 23. 10:35
반응형

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

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가 세터의 속성을 해당 유형의 종속 속성으로 해결할 수 있도록 유형을 지정해야 합니다.

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

<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>

이 두 가지 방법으로 스타일을 선언하는 것이 당신의 질문에 답할 수 있다고 생각합니다.첫 번째 항목에서는 TargetType이 지정되지 않았지만 속성 이름 앞에 'Label'이 붙습니다.두 번째 방법에서는 Label 객체에 대한 스타일이 작성됩니다.

또 다른 방법은 다음과 같습니다.

<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>

텍스트 블록과 텍스트 상자에 스타일을 적용하고 싶었지만 텍스트 블록이 Control에서 상속되지 않기 때문에 선택한 답변이 작동하지 않았습니다. 내 경우 가시성 속성에 영향을 주고 싶었기 때문에 FrameworkElement를 사용했습니다.

<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}"/>

두 항목 모두 Frameworkelement에서 상속되고 속성이 정의되므로 Visibility 속성에 대해 작동합니다.물론 이것은 Control에서 정의된 속성에서만 작동하지는 않습니다. 계층 트리를 검색하여 기본 클래스를 찾을 수 있습니다. 어쨌든 이것은 상위 검색 결과이고 선택한 답변이 약간 불완전하기 때문에 도움이 될 수 있다고 생각했습니다.

그 질문에는 다른 답이 있다.TargetType 매개 변수는 "Control"을 속성 이름에 접두사로 붙이는 경우에만 다양한 컨트롤에 적용할 수 있도록 스타일을 완전히 해제할 수 있습니다.

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

이것은 베이스 컨트롤 클래스의 속성에만 유효합니다.아이템을 설정하려고 했을 경우소스가 말하길, 컨트롤이 없기 때문에 실패할 수 있다고 합니다.아이템 소스

난 이걸 할 거야

<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>

언급URL : https://stackoverflow.com/questions/802658/can-you-define-multiple-targettypes-for-one-xaml-style

반응형