2009-02-25 3 views
22

wpf 스타일의 basedOn 속성을 dynamicresources와 함께 사용하는 방법이 있는지 궁금합니다. 예 :DynamicResources에서 BasedOn Style 속성 사용

<Style BasedOn="{DynamicResource somestyle}"> 
    <Setter Property="SomeProp" Value="SomeValue"/> 
</Style> 

예 : BasedOn 스타일과 함께 dynamicresources를 사용할 수 없다는 오류를 throw합니다. 누군가가 어떻게 할 수 있었는지 궁금합니다. 감사합니다.

답변

15

나는 주된 이유는 봉인 된 물건이라고 생각합니다. 스타일 계층 구조가있는 경우 :

 Style A 
    /  \ 
    Style A1 Style A2 

이것은 어려운 시나리오는 아닙니다. StyleA은 동적 리소스를 사용하므로 해당 리소스가 변경 될 때마다 Style A1Style A2BasedOn 속성을 변경해야합니다. 그러나 일단 응용 프로그램에서 스타일을 사용하면 봉인 된 객체가됩니다. Style A은 변경 불가능합니다. 당신이 사용할 수있는

한 가지 해결 방법은 다음과 같습니다

  1. Style A 변경해야합니다.
  2. 새로운 Style A 리소스가 될 새 Style 개체를 만듭니다.
  3. Style A1Style A2의 새 버전을 만드십시오. Setters, Resources 등을 모두 복사하는 복사 절차를 작성해야합니다. BasedOnStyle A의 새 버전으로 설정하십시오.
  4. 리소스 컬렉션을 업데이트하여 세 가지 새로운 스타일이 존재하도록하십시오.

{DynamicResource StyleA1}{DynamicResource StyleA2} 이제 그 자원 (4 단계) 변경하고 자동으로 참조를 업데이트한다는 사실을 선택해야합니다.

매우 간단한 시나리오입니다. 실제 스타일 계층 구조는 더욱 복잡 할 수 있습니다. 특히 여러 파일에 분산되어 있고 병합 된 사전에있는 경우 더욱 그렇습니다.

희망 귀하의 문제를 이해하고 도움을 주셨습니다.

+4

이 시나리오는 어떻습니까? 다른 (Ux) 팀이 기본 스타일을 만듭니다 ... 개발자가 기본 스타일 외에도 몇 가지 속성을 설정하려고합니다.이상적으로 이것은 DevStyle BasedOn "DynamicResource UxStyle"이 도움이 될 수있는 시나리오입니다. 이것이 가능하지 않은 경우 컨트롤에 적용하기 전에 두 스타일을 병합하는 대안은 무엇입니까? – Gishu

12

난 당신이 DynamicResourceBasedOn를 사용할 수 없기 때문에, 당신은 당신의 현재 창/UserControl을/무엇이든에 "부모"자원을 보유 ResourceDictionary를 병합하여 StaticResourceDynamicResource을 "변환"수 있다는 것을 발견했습니다. 이제 StaticResource을 사용하여 리소스 객체 (예 : Style)를 참조 할 수 있습니다. 이렇게하면 DynamicResourceDatatriggers을 (변환을 통해) 사용할 수 있습니다.

예 :

<Window.Resources> 
    <ResourceDictionary> 
     <ResourceDictionary.MergedDictionaries> 
      <ResourceDictionary Source="/MyProject.Styles;component/ButtonStyles.xaml"/> 
     </ResourceDictionary.MergedDictionaries> 
     [*Your other resources can be put here*] 
    </ResourceDictionary> 
</Window.Resources> 

... 

<Button Command="{Binding MyCommandInViewModel, RelativeSource={RelativeSource AncestorType=Window}}"> 
    <Button.Style> 
     <Style BasedOn="{StaticResource StyleFromButtonStyles}" TargetType="Button"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SomeBool}" Value="True"> 
        <Setter Property="Button.Content" Value="{StaticResource SomeImage}"/> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding SomeBool}" Value="False"> 
        <Setter Property="Button.Content" Value="{StaticResource SomeOtherImage}"/> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

따라서 Datatriggers 가져온 ResourceDictionary에서 스타일 버튼에 적용된다.

희망이 도움이됩니다.