안녕하세요.
WPF 개발을 하는 도중 막히는 부분이 있어 질문드립니다.
아래는 제가 겪은 것을 간단하게 만든 샘플예제입니다.
우선 아래와 같이 Button을 상속받은 Custom Control을 만들었습니다.
public TestButton : Button
{
public TestButton()
{
this.Style = Application.Current.TryFindResource("TestButtonStyle") as Style;
}
}
<Style
x:Key="TestButtonStyle"
TargetType="{x:Type local:TestButtonStyle}">
<Setter Property="BorderBrush" Value="{StaticResource Black}" />
<Setter Property="BorderThickness" Value="1" />
</Style>
해당하는 Button을 DataTemplate 안에 넣고 사용하려고 아래와 같이 xaml을 구성을 하였습니다.
<Grid>
<Grid.Resources>
<DataTemplate x:Key="TestTemplate">
<local:TestButton x:Name="testButton" Content="Test" >
<local:TestButton.Style>
<Style BasedOn="{StaticResource TestButtonStyle}" TargetType="{x:Type local:TestButton}">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</local:TestButton.Style>
</local:TestButton>
</DataTemplate>
</Grid.Resources>
<ContentPresenter Content="{Binding}" ContentTemplate="{StaticResource TestTemplate}" />
</Grid>
하지만 Button은 Collapsed가 되지 않았습니다.
아래와 같이 DataTemplate에 넣지 않으니 Collapsed가 잘 되더라구요.
<Grid>
<local:TestButton x:Name="testButton" Content="Test" >
<local:TestButton.Style>
<Style BasedOn="{StaticResource TestButtonStyle}" TargetType="{x:Type local:TestButton}">
<Setter Property="Visibility" Value="Collapsed" />
</Style>
</local:TestButton.Style>
</local:TestButton>
</Grid>
몇몇 글을 읽어 보았고,
CustomControl을 만들 때 테마에 DefaultStyle을 설정하지 않고 생성자에서 Style을 할당 했기 때문에
DataTemplate에서 해당 컨트롤의 테마 DefaultStyle을 찾지 못해서 그런건가? 하는 의심이 들었습니다.
해결방법은 여러가지가 있을 것 같은데…
근본적인 원인을 모르고 지나가는 것 같아 한 번 여쭤보려고합니다.
혹시 왜 이런 현상이 나는지 설명해 주실 수 있으실까요?
추가적으로 Custom Control을 만들 때 테마의 DefaultStyle을 DefaultStyleKeyProperty로 지정하지 않고 이렇게 생성자에서 Style을 지정한다면 어떤 차이점이 있을까요?(생성자에서 Style을 넣어줫을 때 DefaultStyle이 될 거 같아 위와 같이 컨트롤을 만들었습니다.)