Estilos de combinación XAML

No tengo mucha esperanza para esto, pero ¿hay alguna manera de combinar estilos múltiples en XAML para crear un nuevo estilo que tenga todas las configuraciones deseadas?

Por ejemplo (pseudo código);

 ...   ...     ... other properties.  

Sé que hay una propiedad ‘BasedOn’ para estilos, pero esa función solo te llevará hasta ahora. Realmente estoy buscando una manera fácil (en XAML) para crear estos estilos ‘combinados’. Pero como dije antes, dudo que exista, a menos que alguien haya oído hablar de tal cosa.

Puede crear una extensión de marcado que fusionará propiedades de estilos y activadores en un único estilo.

A juzgar por los resultados de Google, el más popular es el de este blog: http://bea.stollnitz.com/blog/?p=384

Esto le permitirá fusionar estilos usando syntax similar a css.

Por ejemplo :

           

También podría definir nuevos estilos como estilos fusionados.

Su ejemplo se resolverá yendo:

  

Todo lo que tiene que hacer es agregar esta clase, haga su espacio de nombres y estará apagado y funcionando:

 [MarkupExtensionReturnType(typeof(Style))] public class MultiStyleExtension : MarkupExtension { private string[] resourceKeys; ///  /// Public constructor. ///  /// The constructor input should be a string consisting of one or more style names separated by spaces. public MultiStyleExtension(string inputResourceKeys) { if (inputResourceKeys == null) throw new ArgumentNullException("inputResourceKeys"); this.resourceKeys = inputResourceKeys.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries); if (this.resourceKeys.Length == 0) throw new ArgumentException("No input resource keys specified."); } ///  /// Returns a style that merges all styles with the keys specified in the constructor. ///  /// The service provider for this markup extension. /// A style that merges all styles with the keys specified in the constructor. public override object ProvideValue(IServiceProvider serviceProvider) { Style resultStyle = new Style(); foreach (string currentResourceKey in resourceKeys) { object key = currentResourceKey; if (currentResourceKey == ".") { IProvideValueTarget service = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); key = service.TargetObject.GetType(); } Style currentStyle = new StaticResourceExtension(key).ProvideValue(serviceProvider) as Style; if (currentStyle == null) throw new InvalidOperationException("Could not find style with resource key " + currentResourceKey + "."); resultStyle.Merge(currentStyle); } return resultStyle; } } public static class MultiStyleMethods { ///  /// Merges the two styles passed as parameters. The first style will be modified to include any /// information present in the second. If there are collisions, the second style takes priority. ///  /// First style to merge, which will be modified to include information from the second one. /// Second style to merge. public static void Merge(this Style style1, Style style2) { if(style1 == null) throw new ArgumentNullException("style1"); if(style2 == null) throw new ArgumentNullException("style2"); if(style1.TargetType.IsAssignableFrom(style2.TargetType)) style1.TargetType = style2.TargetType; if(style2.BasedOn != null) Merge(style1, style2.BasedOn); foreach(SetterBase currentSetter in style2.Setters) style1.Setters.Add(currentSetter); foreach(TriggerBase currentTrigger in style2.Triggers) style1.Triggers.Add(currentTrigger); // This code is only needed when using DynamicResources. foreach(object key in style2.Resources.Keys) style1.Resources[key] = style2.Resources[key]; } } 

Si utiliza el código anterior, que se modificó ligeramente con respecto al original en el blog, puede usar adicionalmente el estilo predeterminado actual para que un tipo se pueda fusionar con el “.” syntax:

  

Lo anterior fusionará el estilo predeterminado para TargetType="{x:Type Button}" con los dos estilos suplementarios.