24

Utworzono obraz w ButtonStyle. Teraz utworzyłem załączoną właściwość, aby ustawić źródło dla tego obrazu. Powinny być proste, ale utknąłem z tym.Jak korzystać z załączonej właściwości w ramach stylu?

To mój skrócony ButtonStyle:

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

I to jest przymocowany definicja nieruchomość należy pamiętać, że nie mam pojęcia jak to naprawić wywołania zwrotnego, ponieważ DependencyProperty wydaje się przycisk zamiast obrazu. Przycisk nie wyświetla mojego obrazu w swoim stylu. To trudne.

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())); 
     } 
    } 
} 

ten sposób ustawić źródło obrazu w XAML:

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

jakieś pomysły proszę? Wielkie dzięki,

+0

myślę, odpowiedział, że wkrótce tu chcesz ustawić właściwość przez setter a następnie związać z nim w szablonie? –

+0

Widok reprezentuje cztery przyciski paska narzędzi: http://sl.venuscloud.com/ Chciałbym wprowadzić ścieżkę do ikony dla każdego przycisku z widoku do szablonu poprzez załączoną właściwość. Mam nadzieję, że dzięki temu stanie się to bardziej jasne. Dziękuję – Houman

Odpowiedz

37

Oto jak można ustawić załączony właściwość w stylu

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

Gdy wiązanie z dołączonych właściwości następnie Ścieżka powinna być w nawiasach więc spróbuj użyć RelativeSource Oprawa z TemplatedParent zamiast

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

Edit: powyższy kod działa w WPF, Silverlight to Image pokazy w czasie pracy, ale nie w t projektant z wyjątkiem. Można użyć następującego kodu w PropertyChangedCallback uzyskać Image jako obejście

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; 
} 
+0

Dziękuję. Ten kod kompiluje się teraz, ale nadal nie widzę obrazów. Jestem całkiem pewien, że jest to spowodowane tym, że CallBack of Attached Property jest pusty. Jednak "DependencyObject d" jest sam przycisk. Nie rozumiem ... – Houman

+0

Właśnie zauważyłem, że twoje pytanie zawierało znaczniki WPF i Silverlight, moja odpowiedź dotyczyła WPF. Wypróbuję to dla Silverlight. –

+0

Masz rację. przeprosiny. Myślałem o załączonych właściwościach, które nie byłyby inne. :) – Houman

Powiązane problemy