XAML or HTML

008. 스타일 파생(Derive Style)

XAML 뽀개기

1
2
3
4
5
6
7
8
9
10
11
<Style x:Key="Style_ControlBase">
    <Setter Property="Control.Width" Value="60"/>
    <Setter Property="Control.Height" Value="30"/>
</Style>
            
<SolidColorBrush x:Key="Color_Background_ReadOnlyTextBox" Color="LightGray"/>
<Style x:Key="Style_ReadOnlyTextBox" TargetType="TextBox" 
       BasedOn="{StaticResource Style_ControlBase}">
    <Setter Property="TextBox.IsReadOnly" Value="True"/>
    <Setter Property="TextBox.Background" Value="{StaticResource Color_Background_ReadOnlyTextBox}"/>
</Style>
cs


Style BasedOn 속성을 이용해 이전 Style_ControlBase 스타일을 상속 받아 새로운 스타일을 정의합니다. TargetType을 TextBox 제한하고 Setter 정의시 Class명과 함께 정의한다면 더욱 견고히 스타일을 정의할 있습니다.


1
2
3
4
5
<TextBox Grid.Column="0" Style="{StaticResource Style_ControlBase}"
         Text="TextBox"/>
 
<TextBox Grid.Column="1" Style="{StaticResource Style_ReadOnlyTextBox}"
         Text="ReadOnlyTextBox" Width="100"/>
cs


 

Style_ControlBase 스타일은 Control Class에만 국한되고 Style_ReadOnlyTextBox 스타일은 TextBox Class에만 국한되어 깔끔히 분리되어 재사용될 있습니다.

 

1
2
3
4
5
6
<Style x:Key="Style_ReadOnlyTextBox" TargetType="TextBox" 
       BasedOn="{StaticResource Style_ControlBase}">
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="Background" Value="{StaticResource Color_Background_ReadOnlyTextBox}"/>
    <Setter Property="Width" Value="100"/>
</Style>
cs

 

TargetType을 TextBox 제한한 상태에서는 TextBox Class명을 생략해도 됩니다. 상속 받은 Setter 속성도 다시 정의할 있습니다.

 

1
2
3
4
5
6
<Style TargetType="TextBox" 
       BasedOn="{StaticResource Style_ControlBase}">
    <Setter Property="IsReadOnly" Value="True"/>
    <Setter Property="Background" Value="{StaticResource Color_Background_ReadOnlyTextBox}"/>
    <Setter Property="Width" Value="100"/>
</Style>
cs

 

스타일의 Key 이름을 정의하지 않으면 TargetType에 정의된 모든 Class 일괄로 스타일을 적용할 있습니다.

 

1
2
<TextBox Grid.Column="2" 
         Text="ReadOnlyTextBox"/>
cs

 

 

1
2
3
4
5
6
7
8
Style Style_ReadOnlyTextBox = new Style();
Style_ReadOnlyTextBox.TargetType = typeof(TextBox);
Style_ReadOnlyTextBox.BasedOn = (Style)this.grdTest.FindResource("Style_ControlBase");
Setter setterIsReadOnly = new Setter(TextBox.IsReadOnlyProperty, true);
Setter setterBackgroundS = new Setter(TextBox.BackgroundProperty, Brushes.LightGray);
Style_ReadOnlyTextBox.Setters.Add(setterIsReadOnly);
Style_ReadOnlyTextBox.Setters.Add(setterBackgroundS);
this.txbTest.Style = Style_ReadOnlyTextBox;
cs

 

2번의 스타일 관련 포스트에서 살펴본 XAML 코드는 비하인드 코드에서 동일하게 작성할 있습니다.

 

1
this.txbTest.Style = (Style)this.grdTest.FindResource("Style_ReadOnlyTextBox");
cs

 

XAML 코드에서 이미 정의된 스타일을 적용할 수도 있습니다. 하지만 특수한 경우를 제외하고 여러모로 비효율적이고 선호하지도 권장하지도 않습니다.




샘플 코드 : https://github.com/CharlesKwon/XamlSimplified