2009-02-25 17 views
22

me pregunto si hay una manera de usar la propiedad basedOn de los estilos wpf con los recursos dinámicos. p.ej.Usando BasedOn Style Property en DynamicResources

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

this v.g. arroja un error que indica que el uso de recursos dinámicos en combinación con estilos BasedOn no es posible. me pregunto cómo alguien podría hacer eso? gracias

Respuesta

15

Creo que la razón principal son los objetos sellados. Si tiene una jerarquía de estilos:

 Style A 
    /  \ 
    Style A1 Style A2 

esto podría no ser una situación difícil. Se refiere al StyleA utilizando un recurso dinámico, por lo que cada vez que ese recurso cambie, Style A1 y Style A2 deberían cambiar su propiedad BasedOn. Sin embargo, una vez que se usa un estilo en su aplicación, se convierte en un objeto sellado. Style A se vuelve inmutable.

Una solución que puede utilizar es:

  1. Style A tiene que cambiar.
  2. Crea un nuevo objeto de estilo que será el nuevo recurso Style A.
  3. Crea una nueva versión de Style A1 y Style A2. Debería escribir un procedimiento de copia que realice copias de todos los Setters, Resources, etc. Establezca el BasedOn en la nueva versión de Style A.
  4. Actualice la colección de recursos para que los tres nuevos estilos estén allí.

{DynamicResource StyleA1} y {DynamicResource StyleA2} ahora debe recoger el hecho de que esos cambios recursos (del paso 4) y actualizar todas las referencias de forma automática.

Tenga en cuenta que este es un escenario muy simple. Las jerarquías de estilo de mundo real pueden ser más complejas, especialmente si están distribuidas en varios archivos y provienen de diccionarios fusionados.

Espero haber entendido su problema y haber ayudado.

+4

Qué tal este escenario? Un equipo diferente (Ux) crea los estilos base ... un desarrollador desea establecer un par de propiedades además del estilo base.Idealmente, este es un escenario donde DevStyle BasedOn "DynamicResource UxStyle" habría ayudado ... Si esto no es posible, ¿cuáles son las alternativas para fusionar 2 estilos antes de aplicarlo a un control? – Gishu

12

me he dado cuenta que ya no se puede utilizar en un BasedOnDynamicResource, puede "convertir" a la DynamicResource a StaticResource mediante la fusión de la ResourceDictionary la celebración de sus recursos "padre" de la ventana actual/control de usuario/lo que sea. De esta manera, ahora puede consultar el objeto de recurso (por ejemplo, Style) usando StaticResource. De esta forma puede usar Datatriggers en DynamicResource (mediante conversión).

Ejemplo:

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

Por lo tanto Datatriggers se aplican a un botón con el estilo en un ResourceDictionary importado.

Espero que esto ayude!