실버 라이트 애플리케이션로드에서 병합 리소스 사전을 교체합니다
-
20-09-2019 - |
문제
자원 도로 정의 된 일련의 스타일과 브러시가 내 최상위 컨트롤의 XAML에서 병합으로로드하고 있습니다.
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="/MyAssembly;component/Styles.xaml"/>
</ResourceDictionary.MergedDictionaries>
나는 노력하고있다 선택적으로 XAP에 다른 XAML 파일이 자체 Resourcedictionary로 존재하는 경우 이러한 스타일 및 브러시를 교체하십시오. InitializeComponent ()가 사용자 컨트롤에서 호출되기 전에 런타임 에이 사전을 병합하려고합니다. 다음 코드를 사용하여이를 시도하고 있습니다.
public static class StyleLoader
{
public static void MergeStyle(string xamlUri)
{
try
{
XDocument xaml = XDocument.Load(xamlUri);
ResourceDictionary rd = XamlReader.Load(xaml.ToString()) as ResourceDictionary;
Application.Current.Resources.MergedDictionaries.Add(rd);
}
catch (XmlException ex)
{
// if the file doesn't exist, we can't add it
}
}
}
옵션 파일의 리소스 사전은 잘로드되고 병합되지만 원래 스타일 세트는 항상 이것을 무시하고있는 것 같습니다. XAML에서 병합 사전을 주석하고 런타임에 간단히로드하면 완벽하게 작동합니다.
StyleLoader.MergeStyle("/MyAssembly;component/Styles.xaml");
StyleLoader.MergeStyle("BrushReplacements.xaml");
InitializeComponent();
이 솔루션의 문제는 XAML의 기본 스타일이 없으면 Blend에서 프로젝트를 열 수 없다는 것입니다. 누구나 내 기본 스타일을 혼합 할 수있는 솔루션에 대한 아이디어가 있지만 동적으로로드 된 리소스 사전으로 런타임에서 선택적으로 재정의 할 수 있습니까? 감사!
해결책
다음은 정적 자원을 직접 참조하는 대신 색상/브러시가 바인딩과 함께 적용되는 솔루션입니다.
http://blogs.msdn.com/corrinab/archive/2009/11/24/9927729.aspx
두 번째 부분:
http://blogs.msdn.com/corrinab/archive/2009/12/02/9931283.aspx
현재 나는 이와 같은 것이 런타임에 동적으로 스위칭 테마를 다루는 가장 좋은 방법이라고 생각합니다. 그러나 이와 같은 메커니즘을 사용하기 위해 기존 응용 프로그램을 포트하려면 많은 작업이 필요합니다.