2009-02-25 10 views

Odpowiedz

15

Myślę, że głównym powodem są zapieczętowane obiekty. Jeśli masz hierarchię stylów:

 Style A 
    /  \ 
    Style A1 Style A2 

To nie może być trudny scenariusz. Odwołujesz się do StyleA przy użyciu zasobu dynamicznego, więc gdy tylko zasób się zmieni, Style A1 i Style A2 powinny zmienić swoją właściwość BasedOn. Jednak po zastosowaniu stylu w aplikacji staje się zapieczętowanym obiektem. Style A staje się niezmienny.

Jeden obejście można użyć to:

  1. Style A musi się zmienić.
  2. Utwórz nowy obiekt stylu, który będzie nowym zasobem Style A. Stwórz nową wersję Style A1 i Style A2. Musisz napisać procedurę kopiowania, która tworzy kopie wszystkich Setters, Resources itd. Ustaw BasedOn na nową wersję Style A.
  3. Zaktualizuj kolekcję zasobów, aby dostępne były trzy nowe style.

{DynamicResource StyleA1} i {DynamicResource StyleA2} powinien podnieść fakt, że zmiany te zasoby (z etapu 4) i aktualizować żadnych odniesień automatycznie.

Należy pamiętać, że jest to bardzo prosty scenariusz. Hierarchie w stylu prawdziwego świata mogą być bardziej złożone, zwłaszcza jeśli są rozmieszczone w wielu plikach i pochodzą ze scalonych słowników.

Mam nadzieję, że zrozumiałem Twój problem i pomogłem.

+4

Co z tym scenariuszem - inny zespół (Ux) tworzy style bazowe ... Programista chce ustawić kilka właściwości oprócz podstawowego stylu.Idealnie jest to scenariusz, w którym DevStyle BasedOn "DynamicResource UxStyle" pomógłby. Jeśli nie jest to możliwe, jakie są alternatywy scalania 2 stylów przed zastosowaniem go do kontrolki? – Gishu

12

Znalazłem, że skoro nie można używać BasedOn na DynamicResource można „przerobić” na DynamicResource do StaticResource poprzez połączenie ResourceDictionary trzymając „rodzic” środków do bieżącego okna/UserControl/cokolwiek. W ten sposób można teraz odwoływać się do obiektu zasobu (np. Style) przy użyciu StaticResource. W ten sposób możesz użyć Datatriggers na DynamicResource (przez konwersję).

przykład:

<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> 

Stąd Datatriggers są stosowane do przycisku urządzone w importowanym ResourceDictionary.

Mam nadzieję, że to pomoże!

Powiązane problemy