2011-04-22 5 views
7

한 ResourceDictionary의에서 정적 리소스를 사용실버 라이트 4 - 나는이 사전이있는 경우 다른

dict1.xaml : <Color x:Key="Color1">Red</Color>

dict2.xaml : <SolidColorBrush x:Key="Brush1" Color={StaticResource Color1} />

이 작동 :

app.xaml :

<MergedDictionaries> 
    <ResourceDictionary Source="dict1.xaml"/> 
<MergedDictionaries> 

SomePage.xaml :

<UserControl.Resources> 
    <MergedDictionaries> 
    <ResourceDictionary Source="dict2.xaml"/> 
    </MergedDictionaries> 
</UserControl.Resources> 

이되지 않습니다

App.xaml는 응용 프로그램 수준에서 모두 병합.

Color1에 대한 오류가 발생합니다.

왜 이런가요?/주위에 방법이 있습니까? 나는이 예가 단순하다는 것을 알고 있지만, 실제 예는 너무 길다. 기본적으로 난 그냥 다른 파일 내 스타일과 템플릿을 구성하기 위해 노력하고있어 :

색상 명시 적 스타일

편집 할

  • 많은 암시 적 스타일을
  • 하나
    • 하나 : 호기심, 경우 나는 코드 Application_Startup에, RootVisual 속성을 설정하기 전에, 나는 오류가 발생하지 않습니다 ... 난 그냥 왜 당황 스럽다! 당신은 내가 작동하지 않을 위의 유사한 조금 놀라게 뭔가를 나는 다른 일 전에 사전을 정의로

  • 답변

    5

    불행히도 실버 라이트 리소스 시스템에서 귀찮은 제한 사항에 부딪혔습니다. 일부 최적화 문제 만 생각할 수 있습니다. MergedDictionaries의 각 사전이 병렬로로드되는 비동기 동작이있는 것처럼 보입니다. 따라서 "dict2.xaml"이로드 될 때 "dict1.xaml"의 내용에 의존 할 수 없습니다.

    App.xaml :

    <ResourceDictionary.MergedDictionaries> 
        <ResourceDictionary Source="dict2.xaml" /> 
    <ResourceDictionary.MergedDictionaries> 
    

    Dict2.xaml :

    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries> 
         <ResourceDictionary Source="dict1.xaml" /> 
        </ResourceDictionary.MergedDictionaries> 
        .... <!-- dict2 resource --> 
    </ResourceDictionary> 
    
    +0

    누구나 Windows 8/Metro에서 작동하도록 하시겠습니까? – Nilzor

    1

    이 한

    <Application.Resources> 
         <ResourceDictionary> 
          <ResourceDictionary.MergedDictionaries> 
           <ResourceDictionary Source="dict1.xaml" /> 
           <ResourceDictionary Source="dict2.xaml" /> 
          </ResourceDictionary.MergedDictionaries> 
         </ResourceDictionary> 
        </Application.Resources> 
    

    App.xaml

    에있을 것입니다.

    +0

    스택의 맨 아래에 사전에 대한 종속성이 없는지 확인하기 위해 조심 것과 같은이 게시하기 전에 그것은 명백한 범인이 될 것입니다. 그러나 운이 없다. 그것은 동시에 해결하기 위해 노력하고있는 것 같습니다. 이것은 말도 안되는 것입니다. 왜냐하면 MS가 'DynamicResource'를주지 않는 경우에 한 가지 사례를 볼 수 없기 때문입니다. – Kir

    +0

    볼 때 도움이 될 수 있습니다. 귀하의 app.xaml 실패했을 때 당신이 그것을 가지고. 나는이 일을 스스로했고 특별한 일을 보거나 생각할 수 없다. – tam

    +0

    그게 내 App xaml이 파일 선언 (제쳐 먹지 않은 것) 옆에있다. 이 작업을 수행했다면 다른 리소스에서 정의 된 리소스를 참조하는 사전을 사용 했습니까? 문자 그대로, 나는 두 개의 dicts, mergeddictionaries, 사전 중 하나의 스타일을 사용하는 하나의 textblock을 가진 하나의 페이지를 제외하고는 다른 어떤 것도없는 전혀 새로운 프로젝트에서 이것을 재현 해 냈습니다. – Kir

    1

    당신은 그것을 할 수 있습니다 : -

    가장 간단한 해결책은 Dict2에서 Dict1의 병합을 포함하는 것입니다 방법은 @Anthony에 의해 제안되었지만 여기에는 한가지주의 할 점이 있습니다 - 예를 들어, 5 개의 다른 사전에서 첫 번째 리소스 사전을 사용하면 5 번로드되고 5 번로드되고 동일한 리소스 사전이 6 개 복사됩니다 ary (App.xaml에서 참조 할 때 사용)는 성능에별로 좋지 않습니다.이것은 여기에서 silverlight의 리소스 사전 인 small 서브 클래스 인 http://softnotes.wordpress.com/2011/04/05/shared-resourcedictionary-for-silverlight/을 사용하여 수정할 수 있습니다.

    0

    나는이 사람과 함꺼있다. "병합 된 리소스 사전 컬렉션의 리소스 조회 논리는 처음부터 끝나야합니다." 다시 말해, 하나가 다른 하나를 참조하는 여러 개의 사전이있는 경우 참조 된 자원을 포함하는 사전이 스택 맨 위에 있어야합니다. 당신이 올바른 순서로 참조하고 있는지 확인 스택의 상단에있는 사전을 이미 시도

    <Application.Resources>   
    <ResourceDictionary> 
        <ResourceDictionary.MergedDictionaries>          
        <ResourceDictionary Source="Dict1.xaml" /> 
        <ResourceDictionary Source="dependsOnDict1.xaml" />     
        </ResourceDictionary.MergedDictionaries>   
    </ResourceDictionary>  
    </Application.Resources> 
    
    +1

    이것은 보여지는 행동이 아닙니다. 이 경우에 문제가 없으며 거의 ​​1 년 전에이 질문을 게시하지 않았을 것입니다. 그것을 시도하고 볼 :) – Kir