[wpf] Generic.xaml의 특별한 점은 무엇입니까?

재사용하고 팀의 다른 구성원과 공유하기 위해 ResourceDictionary 파일을 구성하는 방법을 알아 내려고 노력했습니다.

“Generic.xaml”을 계속 사용하지만 MSDN에서 Generic.xaml을 찾거나 Google 검색을하는 경우 블로그 게시물과 포럼 질문 만있는 것 같습니다. 정말 권위 있고 명확한 것을 강타하십시오.

Generic.xaml과 MyRandomlyNamedResourceDictionary.xaml의 차이점은 무엇입니까? 어느 쪽이든, Source 속성을 사용하여 라이브러리에 저장된 ResourceDictionaries를 참조해야합니다. 예 :

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>

그렇다면 Generic.xaml은 정확히 어떤 이점을 제공합니까? 응용 프로그램에 여러 가지 “모양”을 제공하지 않는 경우 (예 : 테마가 하나만있는 경우) 어떤 목적이 있습니까?



답변

WPF의 모든 컨트롤에는 무엇보다도 컨트롤의 기본값을 제공하는 기본 스타일이 ControlTemplate있습니다. WPF는 컨트롤과 동일한 어셈블리의 Themes 폴더에있는 특수 리소스 사전에서 기본 스타일을 찾습니다. 기본 스타일의 키는 Control.DefaultStyleKey종속성 속성에 의해 제공되며 기본값은 Control의 각 하위 클래스에서 재정의됩니다.

리소스 사전의 이름은 Aero 테마를 사용하는 Vista와 같은 현재 Windows 테마에 따라 다르며 사전은 Aero.NormalColor.xaml이라고하며 XP에서는 기본 테마를 사용합니다. Luna.NormalColor.xaml입니다. 테마 사전에 스타일이 없으면 Generic.xaml에서 테마에 의존하지 않는 컨트롤을 찾습니다.

이것은 직접 또는 간접적으로 정의한 사용자 정의 컨트롤, 즉 Control에서 파생 된 클래스에만 적용됩니다. 표준 컨트롤에서 파생 DefaultStyleKeyProperty.OverrideMetadata하고 정적 생성자를 호출하여 표준 컨트롤의 기본 스타일을 변경할 수 있지만 ControlTemplate을 포함한 전체 스타일을 제공해야합니다.

ThemeInfo 특성을 사용하여 WPF에 기본 스타일에 대한 외부 어셈블리를 찾도록 지시 할 수 있습니다. 외부 어셈블리의 이름은 <YourAssembly >입니다. <ThemeName >.dll, 예 : PresententationFramework.Aero.dll.


답변

A의 generic.xaml파일 (경우를 구분)이 될 뭔가 특별한 두 가지 조건이 충족되어야합니다 :

  • 프로젝트의 테마 하위 루트 폴더에 있어야합니다.
  • 조립이 표시되어야합니다 ThemeInfoAttribute(보통의 AssemblyInfo.cs)

그런 다음 컨트롤에 적용하려는 기본 스타일의 기본 조회 위치로 사용됩니다. 스타일이 기본값이 되려면 스타일을 지정할 컨트롤 유형으로 TargetType과 x : Key를 모두 선언해야합니다.

전체 테마와 테마 전환을 응용 프로그램에 추가하려는 경우 일부 코딩으로이 기술을 사용하면 기본 리소스 사전 만 정의 할 수 있습니다.


답변