2009-02-25 9 views
22

Mi chiedo se esiste un modo per utilizzare la proprietà basedOn degli stili wpf con dynamicresources. per esempio.Utilizzo della proprietà Style Based su DynamicResources

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

ad es. genera un errore che indica che l'utilizzo di dynamicresources in combinazione con gli stili BasedOn non è possibile. mi chiedo come qualcuno potrebbe farlo? grazie

risposta

15

Penso che il motivo principale siano gli oggetti sigillati. Se hai una gerarchia di stile:

 Style A 
    /  \ 
    Style A1 Style A2 

questo potrebbe non essere uno scenario difficile. Si fa riferimento a StyleA utilizzando una risorsa dinamica, quindi ogni volta che tale risorsa cambia, Style A1 e Style A2 devono modificare la loro proprietà BasedOn. Tuttavia, una volta che uno stile viene utilizzato nella tua applicazione, diventa un oggetto sigillato. Style A diventa immutabile.

Una soluzione è possibile utilizzare è:

  1. Style A deve cambiare.
  2. Creare un nuovo oggetto Stile che sarà la nuova risorsa Style A.
  3. Creare una nuova versione di Style A1 e Style A2. Dovresti scrivere una procedura di copia che faccia le copie di tutti gli Setters, Resources, ecc. Impostare BasedOn sulla nuova versione di Style A.
  4. Aggiorna la raccolta delle risorse in modo che i tre nuovi stili siano lì.

{DynamicResource StyleA1} e {DynamicResource StyleA2} dovrebbe ora prendere il fatto che tali cambiamenti risorse (dal punto 4) e aggiornare automaticamente tutti i riferimenti.

Si noti che questo è uno scenario molto semplice. Le gerarchie di stile reale possono essere più complesse, specialmente se sono distribuite su più file e provengono da dizionari uniti.

Spero di aver capito il tuo problema e di averlo aiutato.

+4

Che ne dici di questo scenario: un diverso team (Ux) crea gli stili di base ... uno sviluppatore desidera impostare un paio di proprietà oltre allo stile di base.Idealmente questo è uno scenario in cui DevStyle BasedOn "DynamicResource UxStyle" avrebbe aiutato. Se ciò non è possibile, quali sono le alternative per unire 2 stili prima di applicarlo a un controllo? – Gishu

12

Ho scoperto che dal momento che non è possibile utilizzare BasedOn su un DynamicResource, è possibile "convertire" il DynamicResource a StaticResource dalla fusione del ResourceDictionary tenendo le risorse "madre" alla finestra/UserControl/qualunque corrente. In questo modo è ora possibile fare riferimento all'oggetto risorsa (ad esempio Style) utilizzando StaticResource. In questo modo è possibile utilizzare Datatriggers su DynamicResource (tramite conversione).

Esempio:

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

Quindi Datatriggers sono applicati a un pulsante designato in un importato ResourceDictionary.

Spero che questo aiuti!