WPF: ¿Plantilla reutilizable para botones de imagen?

Mi proyecto WPF usa muchos botones de imagen, pero como no he encontrado la manera de hacerlo correctamente (tengo que escribir los mismos activadores y estilo cada vez, solo la diferencia es la fuente de la imagen), mi diccionario de recursos se hizo muy largo para nada. ¿Hay una mejor manera de hacer esto?

Aquí hay una muestra del estilo que estoy usando para mis botones:

               

Gracias 🙂

La forma más fácil es crear un control específico con una propiedad de Image :

 public class ImageButton : Button { static ImageButton() { DefaultStyleKeyProperty.OverrideMetadata(typeof (ImageButton), new FrameworkPropertyMetadata(typeof (ImageButton))); } public ImageSource Image { get { return (ImageSource)GetValue(ImageProperty); } set { SetValue(ImageProperty, value); } } public static readonly DependencyProperty ImageProperty = DependencyProperty.Register("Image", typeof(ImageSource), typeof(ImageButton), new PropertyMetadata(default(ImageSource))); } 

Luego simplemente crea un estilo para él en generic.xaml y se une a la propiedad de Image lugar de establecer la imagen explícitamente:

  

Entonces puedes usarlo así:

  

Si necesita más imágenes para diferentes estados del botón, puede agregar más propiedades de dependencia al control.

Otro enfoque posible es usar lo que yo llamo un “estilo parametrizado”, para evitar crear un control específico; Ver esta publicación del blog para más detalles.

Puede intentar crear un control personalizado que se hereda de Button y usarlo como TargetType en su plantilla. Luego puedes usar TemplateBinding en la Fuente de Imagen.

  

Deberá crear la propiedad ImageSource en su control personalizado. De esa manera, puede establecer la fuente en xaml, pero solo necesita una plantilla de recursos.

Puedes usar el atributo BasedOn de esta manera:

  

Esto creará un estilo de botón con los mismos atributos que su ButtonStyle, pero con un fondo DeepSkyBlue.