문제

자원 도로 정의 된 일련의 스타일과 브러시가 내 최상위 컨트롤의 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

현재 나는 이와 같은 것이 런타임에 동적으로 스위칭 테마를 다루는 가장 좋은 방법이라고 생각합니다. 그러나 이와 같은 메커니즘을 사용하기 위해 기존 응용 프로그램을 포트하려면 많은 작업이 필요합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top