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


153

재사용하고 팀의 다른 구성원과 공유하기 위해 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은 정확히 어떤 이점을 제공합니까? 응용 프로그램에 여러 가지 "모양"을 제공하지 않는 경우 (예 : 테마가 하나만있는 경우) 어떤 목적이 있습니까?


6
사용자 정의 컨트롤과 달리 사용자 정의 컨트롤과 함께 사용하는 경우 generic.xaml 사전에서 코드로 병합 할 필요가 없습니다.
Eternal21

답변:


152

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.


고마워요, 필 그래서 만약 당신이 일반적인 Button 컨트롤을 위해 새로운 ControlTemplate을 제공하고 싶다면 (즉, Button에서 파생되는 내 자신의 특수 클래스를 작성하지 않는 경우) 이것이 "테마"의 일부로 간주되지 않습니까?
devuxer

예, 표준 컨트롤을 다시 템플릿으로 바꾸거나 스타일을 변경하려면 UserControl / Window / Application / Whatever 레벨에서 일반 Resources 요소를 사용하십시오. 암시 적 키 ( msdn.microsoft.com/en-us/library/… ) 와 함께 스타일을 사용 하여 특정 유형의 모든 컨트롤을 변경할 수 있습니다.
Phil Devaney 08:15

@Zaheylu 그것은 지금 작동하고 있습니다 (MS가 그들의 문서를 업데이트하고 있다고 생각합니다)
Alan McBee-MSFT

104

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

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

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

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


3
"기본 스타일"의 의미를 명확히 할 수 있습니까? 이것은 모든 버튼이 TargetType이 "Button"인 스타일을 자동으로 취한다는 것을 의미합니까? 아니면 여전히 x:Key글을 써서 참조해야 <Button Style="{StaticResource MyButtonStyle}" />합니까? ResourceDictionary에 TargetType이 "Button"인 둘 이상의 스타일이 포함되어 있으면 어떻게됩니까? 감사.
devuxer

3
이 문제를 해결하는 데 도움이되는 또 다른 질문 : Generic.xaml은 다른 요소의 기본 모양을 정의한 CSS 파일과 동등한 WPF입니다 h1 {color:#00ff00}.
devuxer

3
예, 기본 스타일은 키를 명시 적으로 참조하지 않고 적용되며 동일한 두 개의 스타일은 사전에 두 개의 동일한 키가 있다는 오류를 표시합니다. 그리고 그렇습니다. 당신은 기본 행동에 대해 그렇게 생각할 수 있습니다.
Kenan EK

3
generic.xaml 파일 자체에는 특별한 제한이 있지만 generic.xaml 내의 사전 항목은 항목을 참조 할 수있는 병합 된 사전 일 수 있습니다.
Tormod
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.