2012-10-22 5 views
2
<Application x:Class="CustControls.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml"> 
<Application.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/ControlLibrary;component/Styles/ControlResource.xaml"/> 
      <ResourceDictionary Source="StringLocalization/Dictionary_fr-FR.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
    </ResourceDictionary> 
</Application.Resources> 

wpf에서 리소스 사전 소스 이름을 동적으로 변경하는 방법은 무엇입니까?

지금 내가있는 ResourceDictionary의 소스 이름 소스 = "StringLocalization/Dictionary_fr-FR.xaml"소스 = "StringLocalization/Dictionary_en-US.xaml"어떻게해야합니까

-을 변경하려면 그에 대한.

+0

왜 그렇게하고 싶습니까? – pdvries

+0

http://social.msdn.microsoft.com/forums/en-US/wpf/thread/4ed27a95-bc48-4694-b5fb-66fdab8a79f3 – Klaus78

답변

4

MSDN-documentation

"코드에서, 당신은 소스 속성을 설정하지 마십시오 설명합니다. 대신에, 당신이 중 하나를 만들거나 하나를로드하여 ResourceDictionary에 오브젝트를 취득해야합니다. 기존로드하는 한 방법 ResourceDictionary를 에 XamlReader.Load를 호출하고 ResourceDictionary 루트가있는 기존 XAML 파일 스트림을 호출 한 다음XamlReader.Load 반환 값을 ResourceDictionary로 캐스팅합니다. "

하나를 만들거나 하나만로드하여 ResourceDictionary를 얻을 수있는 것처럼 보입니다.

ResourceDictionaries를 사용하여 용도를 이해하는 것도 중요합니다. '공유 리소스'로 사용하려는 경우 '포함 리소스'작업을 사용하여 사전을 작성할 수 없습니다. '콘텐츠'로 표시되고 경로 위치에 제대로 연결되어 있는지 확인하십시오.

자원 병합 사전에 자원 조회 범위에 위치를 차지 : 또한, 그 또한 중요한 자원합니다 (MSDN-documentation에서 가져온) 다른 이상 선택되는 관해서 어떻게 행동하는지 병합 사전 이해하기 메인 리소스 사전의 범위 바로 뒤에 병합됩니다. 리소스 키는 개별 사전 내에서 고유 한 이어야하지만 병합 된 사전 집합의 키는 번으로 여러 번 존재할 수 있습니다. 이 경우 이 반환되는 리소스는 MergedDictionaries 컬렉션에서 순차적으로 발견되는 마지막 사전에서 나옵니다. MergedDictionaries 컬렉션이 XAML에 정의 된 경우 컬렉션에 병합 된 사전의 순서는 태그에 제공된 과 같은 요소 순서입니다. 키가 기본 사전 에 정의되어 있고 병합 된 사전에 정의되어있는 경우 인 자원은 기본 사전에서 나옵니다. 이러한 범위 지정 규칙 은 정적 리소스 참조와 동적 리소스 참조에 똑같이 적용됩니다.

코드를 보면 다른 ResourceDictionary를 응용 프로그램에로드하려는 것 같습니다. 이것이 전부라면 MergedDictionaries 컬렉션에 추가하는 것이 이미 충분할 것입니다.

런타임에 하나를로드하려면 다음 코드를 사용할 수 있습니다 (또는 이와 유사). 그냥 당신이 당신의 자원을 포함하지 않도록합니다

try 
    { 
     string path = @".\Themes\Dictionary1.xaml"; 
     var xmlTextReader = new XmlTextReader(path); 
     var resourceDictionary = (ResourceDictionary)XamlReader.Load(xmlTextReader); 
     Application.Current.Resources.MergedDictionaries.Clear(); 
     Application.Current.Resources.MergedDictionaries.Add(resourceDictionary); 
    } 
    catch (Exception exception) 
    { 
     Debug.WriteLine(exception.Message); 
    } 

여기 당신이 그것을 필요로하는 경우에 code입니다. 이것이 도움이되는지 알려주십시오.

관련 문제