문제

내 WPF 응용 프로그램과 별도의 dll에 BaseSkin과 여러 UserSkins가 있습니다.

응용 프로그램을 사용하는 사람에 따라 기본 스킨과 사용자 스킨 중 하나가 리소스 사전에 병합되어 응용 프로그램에서 사용할 수 있도록 로드됩니다.

제가 목표로 하는 것은 BaseSkin 파일에서 스타일을 지정한 다음 특정 UserSkin 파일에서 이를 재정의하고 필요한 속성을 변경할 수 있는 기능입니다.

다음과 같이 BasedOn 속성을 사용하면 이 작업을 수행할 수 있다는 것을 알고 있습니다.

베이스:

<Style x:Key="ButtonBg" TargetType="{x:Type Button}">
    <Setter Property="Background" Value="Green"/>
</Style>

사용자:

<Style x:Key="CustomButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource ButtonBg}">
    <Setter Property="Background" Value="Blue"/>
</Style>

문제는 이제 요소가 실제로 구현되지 않을 수 있는 CustomButtonBg 스타일을 가져야 한다는 것입니다.두 스타일 모두 동일한 키(ButtonBg)를 사용하도록 할 수 있는 방법이 있습니까? 병합할 때 응용 프로그램이 먼저 User에서 ButtonBg라는 스타일을 찾고 존재하지 않으면 기본에 있는 스타일을 사용하도록 합니까?

BaseSkin 파일을 가리키도록 BasedOn 특성에 어셈블리 이름을 지정할 수 있다면 동일한 키를 제공할 때 이름 지정 오류를 피할 수 있을 것이라고 생각했지만 그렇게 할 방법을 찾을 수 없습니다.다른 옵션은 아무것도 변경되지 않더라도 각 스타일을 강제로 구현하거나 스킨에서 프로그래밍 방식으로 확인하는 것입니다. 그러나 이는 최후의 수단입니다.

도움이 되었습니까?

해결책

리소스 조회 논리를 활용해 볼 수 있습니다.WPF가 키로 리소스를 찾으려고 할 때 먼저 현재 요소의 ResourceDictionary, 그 다음은 그 부모, 그 다음은 그 부모 등등입니다.

따라서 사용자에게 조건부라고 말씀하셨기 때문에 ResourceDictionary ~에서 Window 원래 기지가 Application 수준.

편집하다: 더 나은 정보가 있습니다.에서 병합된 사전의 MSDN:

병합된 사전 동작

병합된 사전의 리소스는 병합된 기본 리소스 사전의 범위 바로 뒤에 있는 리소스 조회 범위의 위치를 ​​차지합니다.리소스 키는 개별 사전 내에서 고유해야 하지만 병합된 사전 세트에서는 키가 여러 번 존재할 수 있습니다.이 경우 반환되는 리소스는 MergedDictionaries 컬렉션에서 순차적으로 발견된 마지막 사전에서 제공됩니다.MergedDictionaries 컬렉션이 XAML에 정의된 경우 컬렉션에서 병합된 사전의 순서는 태그에 제공된 요소의 순서입니다.키가 기본 사전과 병합된 사전에 정의된 경우 반환되는 리소스는 기본 사전에서 제공됩니다.이러한 범위 지정 규칙은 정적 리소스 참조와 동적 리소스 참조 모두에 동일하게 적용됩니다.

이는 기본 스킨을 다른 방식으로 정의할 수 있음을 의미합니다. ResourceDictionary 그리고 다른 것으로 병합 ResourceDictionary.후자에 사용자 스킨이 있으면 이를 먼저 찾고, 그렇지 않으면 Base가 포함된 병합된 사전을 계속 드릴다운합니다.각 사용자 사전은 기본 사전을 병합할 수 있으며 둘 다 별도로 로드하는 대신 사용자 사전을 앱에 로드하기만 하면 됩니다.

다른 팁

당신은 당신의 기반을 BaseButtonBG로 지명 할 수 있으며 사용자 기반 Resourcedictionary를 병합하지 않을 때 다음과 같은 일반적인 것들을 병합 할 수 있습니다.

<Style x:Key="ButtonBg" TargetType="{x:Type Button}" BasedOn="{StaticResource BaseButtonBg}"/>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top