.net wpf silverlight dependency-properties attached-properties

.net - ¿Cómo usar la propiedad adjunta dentro de un estilo?



wpf silverlight (1)

Creé una Imagen dentro de un Estilo de Botón. Ahora he creado una propiedad adjunta para poder establecer el origen para esa imagen. Debería ser sencillo pero estoy atascado con eso.

Este es mi ButtonStyle acortado:

<Style x:Key="ToolBarButtonStyle" TargetType="Button"> ... <Image x:Name="toolbarImage" Source="{TemplateBinding PrismExt:ImageSourceAttachable:ImageSource}" Width="48" Height="48" /> ... </Style>

Y esta es la definición de propiedad adjunta. Tenga en cuenta que no tengo idea de cómo reparar la devolución de llamada, ya que la propiedad de dependencia parece ser el botón en lugar de la imagen. Y el botón no expone mi imagen dentro de su estilo. Es complicado.

namespace SalesContactManagement.Infrastructure.PrismExt { public class ImgSourceAttachable { public static void SetImgSource(DependencyObject obj, string imgSource) { obj.SetValue(ImgSourceProperty, imgSource); } public static string GetImgSource(DependencyObject obj) { return obj.GetValue(ImgSourceProperty).ToString(); } // Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc... public static readonly DependencyProperty ImgSourceProperty = DependencyProperty.RegisterAttached("ImgSource", typeof(string), typeof(ImgSourceAttachable), new PropertyMetadata(Callback)); private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e) { //((Button)d).Source = new BitmapImage(new Uri(Application.Current.Host.Source, e.NewValue.ToString())); } } }

Así es como configuro el origen de la imagen dentro de XAML:

<Button PrismExt:ImgSourceAttachable.ImgSource="./Images/New.png" Style="{StaticResource ToolBarButtonStyle}" />

Alguna idea, por favor? Muchas gracias,


Así es cómo puede configurar su propiedad adjunta en un estilo

<Style x:Key="ToolBarButtonStyle" TargetType="Button"> <Setter Property="PrismExt:ImgSourceAttachable.ImgSource" Value="./Images/New.png"/> <!--...--> </Style>

Al enlazar a las propiedades adjuntas, la ruta de acceso debe estar entre paréntesis, por lo tanto, intente utilizar RelativeSource Binding con TemplatedParent

<Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <Image x:Name="toolbarImage" Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=(PrismExt:ImgSourceAttachable.ImgSource)}" Width="48" Height="48"> </Image> </ControlTemplate> </Setter.Value> </Setter>

Editar: El código anterior funciona en WPF; en Silverlight, la Image muestra en tiempo de ejecución pero falla en el diseñador con una excepción. Puede usar el siguiente código en PropertyChangedCallback para obtener la Image como una solución alternativa

private static void Callback(DependencyObject d, DependencyPropertyChangedEventArgs e) { Button button = d as Button; Image image = GetVisualChild<Image>(button); if (image == null) { RoutedEventHandler loadedEventHandler = null; loadedEventHandler = (object sender, RoutedEventArgs ea) => { button.Loaded -= loadedEventHandler; button.ApplyTemplate(); image = GetVisualChild<Image>(button); // Here you can use the image }; button.Loaded += loadedEventHandler; } else { // Here you can use the image } } private static T GetVisualChild<T>(DependencyObject parent) where T : DependencyObject { T child = default(T); int numVisuals = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < numVisuals; i++) { DependencyObject v = (DependencyObject)VisualTreeHelper.GetChild(parent, i); child = v as T; if (child == null) { child = GetVisualChild<T>(v); } if (child != null) { break; } } return child; }