2012-02-23 4 views
0

내 응용 프로그램에 여러 테마를 정의하고 원하는대로 전환하려고합니다. 그러나 각 테마의 각 컨트롤 스타일을 별도의 ResourceDictionary에 넣으므로 파일을 비즈니스 스타일로 만들 수 있습니다. 신속하고 쉽게 관리하십시오. 그러나 문제는 다음과 같습니다. 중첩 된 리소스 사전의 스타일이 적용되지 않습니다. 제안 사항이 있으십니까? 감사합니다.중첩 된 리소스 사전

답변

2

각 컨트롤에 대해 별도의 리소스 사전을 사용하고 다른 테마에 대해서도 반복한다고 가정합니다. .. Theme1.xaml을하고 .. 예를이 주제로 오는 모든 리소스 사전을 병합 :

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
> 
<ResourceDictionary.MergedDictionaries> 
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/Button.xaml"/> 
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/Combobox.xaml" /> 
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/ListBox.xaml" /> 
    <ResourceDictionary Source="pack://application:,,,/UrProject;component/Themes/Theme1/Checkbox.xaml" /> 
</ResourceDictionary.MergedDictionaries> 

당신은 추가 할 수 그래서 난 당신이 각각의 테마 등의 리소스 사전을 유지하는 것이 좋습니다 테마 전환을 위해 애플리케이션에이 리소스 사전을 제거하십시오. 희망이 도움이됩니다. :)

+0

고맙습니다, 필자도 예외가 없다, 같은 일을하지만, 스타일이 적용되지 않습니다. – Mohsen

+0

응용 프로그램에 테마를 적용하는 방법은 무엇입니까? 코드를 게시 할 수 있습니까? – vimal

+0

코드는 작성된 xaml과 똑같지 만 스타일은 aplly가 아닙니다 – Mohsen

0

당신은이 같은 응용 프로그램에 테마를 적용 할 수 있습니다 ..

public static void ApplyTheme(string themeName) 
    { 
     if (string.IsNullOrEmpty(themeName) == false) 
     { 
      bool exist = false; 
      string themeFileName = 
       string.Format("/UrProject;component/Styles/{0}{1}", themeName, ".xaml"); 
      theme.Source = new Uri(themeFileName, UriKind.RelativeOrAbsolute); 
      foreach (ResourceDictionary dictionary in Application.Current.Resources.MergedDictionaries) 
      { 
       if (string.Equals(dictionary.Source, themeFileName)) 
       { 
        exist = true; 
        break; 
       } 
      } 
      if (exist == false) 
      { 
       Application.Current.Resources.MergedDictionaries.Add(theme); 
      } 

     } 
    }