WPF Custom Control 생성 시 DefaultStyleKeyProperty 설정 관련 질문

안녕하세요. :smile:
WPF 사용자 지정 컨트롤을 만들 때 자동으로 생성되는 DefaultStyleKeyProperty 부분에 대해 질문 드립니다.

image

image

static 생성자 부분:

public class JamesPanel : ContentControl
{
    static JamesPanel()
    {
        DefaultStyleKeyProperty.OverrideMetadata(typeof(JamesPanel),
            new FrameworkPropertyMetadata(typeof(JamesPanel)));
    }
}

CustomControl을 생성하면 static 생성자에 작성된 코드와 Generic.xaml 파일을 보게되는데요.

이 부분에 대해 정확히 이해하지 못한체로 모두 제거하고나서 따로 App.xaml에 Style을 만들어 사용하고 있습니다.

궁금한 점:

1. Application 어디에도 등록되어있지 않은 Generic.xaml 파일은 약속된 위치일까요?
Appplication 어디에서도 Resource를 등록하지 않았음에도 불구하고 연결되어 있습니다.

2. 정적(static) 생성자가 아닌 인스턴스 생성자에서 DefaultStyleKey 속성을 설정하는 것과 어떤 차이가 있을까요?

3. 정적 생성자에서 DefaultStyleKeyProperty.OverrideMetadata() 호출 시 어떻게 Generic.xaml 파일이 리소스에 등록되는 건지 궁금합니다.

4. 마지막으로, 자동으로 생성되는 이 규칙을 지키는 것이 좋은 방식인가요?
지금까지 제가 만들어왔던 구조에서는 한번도 이 방식을 사용하지 않았지만 이번 기회에 더 이해하고 적용해 보고자 합니다.


설명이 부족한 점 죄송합니다.

읽어주셔서 감사합니다. :smile:

1 Like

WPF는 코드와 디자인을 완전히 분리하는 구조를 가집니다. WPF에서의 디자인은 스타일을 통해 적용되는데요, 종속성의 관점에서 App.xaml (전역 리소스)에 스타일을 배치하는것은 옳지 않습니다.

  1. Themes/Generic.xaml은 기본 스타일의 리소스 위치입니다. 아무런 테마를 지정하지 않을 경우 이곳의 스타일이 적용되게 됩니다.

  2. 해당 타입 컨트롤에 동일한 적용이 필요한 설정은 해당 컨트롤이 최초 사용(인스턴스화) 되는 (정적 생성자) 시점에서 하는것이 이상적이라고 생각합니다.

  3. Themes/Generic.xaml이 기본 테마이므로 아무런 테마 설정이 없을 경우 기본으로 적용되게 됩니다.

  4. 이규칙을 지키는 것이 좋습니다. 다양한 테마를 설령 만들지 않는다 하더라도, 컨트롤의 디자인과 어플리케이션의 리소스와 분리하는건 WPF의 중요한 디자인 분리 원칙이라고 생각합니다.

2 Likes

@dimohy 매번 답변 감사드립니다 :smile:

말씀해주신 부분 잘 이해하고 적용해보도록 하겠습니다.!!

디모이님 말씀에 한가지 더 얹자면

  1. ThemeInfoAttribute 을 통해서 그것의 조절이 가능합니다.

1 Like

@SangHyeon.Kim 헛 감사합니다!!
ThemeInfoAttribute 해보겠습니다. :smile: