2012-04-23 3 views
2

DynamicResource에 대한 WPF 지원은 사용자가 실행중인 응용 프로그램의 모양과 변경을 변경할 수 있기 때문에 좋습니다.Windows의 DynamicResource 앱 앱을 저장 하시겠습니까?

WinRT는 DynamicResource를 지원하지 않습니다.

사용자가 동적으로 UI 테마를 변경할 수있게 해주는 앱을 작성하는 권장 방법은 무엇입니까?

답변

0

MVVM 패턴을 사용하는 경우보기 및보기 모델과 결혼하는 방식에 따라 기본 데이터를 다시 만들지 않고 전환 된 테마를 기반으로보기를 다시 만드는 것이 매우 쉽습니다.

테마 리소스 사전을 여러 개 갖고 있으며 애플리케이션 리소스 사전과 병합 한 다음 전환하여 해당보기를 다시 만듭니다.

1

저는 현재 이것에 대해서도 좋은 디자인을 제시하려고합니다. DynamicResources가 부족하다는 사실을 알기 전에 나는 "ready-to-go"라고 공정하게 뭔가를 가지고있었습니다. 죄송합니다. 그런 다음 어떤 테마 -을 도출 할

public class ThemedViewModel : ViewModelBase 
{ 
    public Brush Foreground { get { return ViewModelSelector.Settings.Theme.Foreground; } } 

    public ThemedViewModel() 
    { 
     ViewModelSelector.Settings.PropertyChanged += (sender,arg) => 
     { 
      if(arg.PropertyName == "Theme") 
      { 
       RaisePropertyChanged("Foreground"); 
      } 
     } 
    } 
} 

:

내가 함께 온 가장 좋은 방법은에 요소가 결합 할 수있는 UI 자원을 설정 VM에 대한 변경 사항을 청취하고 노출하는 ThemedViewModel 기반을 가지고하는 것입니다 이것으로부터 VM 기반 VM을 가져오고 테마 UI 요소는 노출 된 리소스에 바인딩됩니다. 그것은 상당히 건조하지만 내 마음 속의 VM의 요점을 깨뜨립니다. VM에 UI 리소스가 없어야합니다. VM에서 어떻게 보이는지는 저와 잘 어울리지 않습니다. 그러나 테마가 내 코드의보기 섹션에 제약을받는 모든 접근 방식은 바인딩 타임에 문제가있는 것으로 보입니다.

1

항상 동적 리소스가 필요한 것은 아닙니다. 다음과 같이 "정적"리소스의 값을 변경하십시오.

Resources.Remove("foo"); 
Resources.Add("foo", "A new hope"); 

이것은 선언적 항목에는 항상 작동하지 않습니다. 이러한 경우 래퍼 객체를 제공 할 수 있습니다. 래퍼를 바꿀 수는 없지만 속성을 업데이트 할 수 있습니다. 아아, 이것이 실행 불가능한 경우가 있습니다.

관련 문제