24

Tôi đã tạo một Hình ảnh trong một ButtonStyle. Bây giờ tôi đã tạo thuộc tính đính kèm để tôi có thể đặt nguồn cho hình ảnh đó. Nên thẳng về phía trước nhưng tôi bị mắc kẹt với nó.Cách sử dụng Thuộc tính được đính kèm trong một kiểu?

Đây là ButtonStyle rút ngắn của tôi:

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

Và đây là định nghĩa tài sản gắn liền, Lưu ý rằng tôi không có ý tưởng làm thế nào để sửa chữa các callback, như DependencyProperty dường như là nút thay vì hình ảnh. Và nút không hiển thị hình ảnh của tôi trong phong cách của nó. Khó khăn của nó.

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

Đây là cách tôi đặt nguồn hình ảnh trong XAML:

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

Bất kỳ ý tưởng xin vui lòng? Nhiều Cảm ơn,

+0

Tôi nghĩ rằng tôi đã trả lời sớm ở đây, bạn có muốn thiết lập thuộc tính thông qua một setter và sau đó liên kết với nó trong mẫu? –

+0

Chế độ xem thể hiện bốn nút trên thanh công cụ như sau: http://sl.venuscloud.com/ Tôi muốn chèn đường dẫn đến Biểu tượng cho từng nút từ chế độ xem vào mẫu thông qua thuộc tính đính kèm. Hy vọng điều này làm cho nó rõ ràng hơn. Cảm ơn bạn – Houman

Trả lời

37

Đây là cách bạn có thể thiết lập tài sản gắn liền của bạn trong một phong cách

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

Khi gắn vào tài sản gắn liền sau đó con đường nên trong ngoặc vì vậy hãy thử sử dụng RelativeSource Ràng buộc với TemplatedParent thay

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

Chỉnh sửa: Mã trên hoạt động trong WPF, trong Silverlight Image hiển thị trong thời gian chạy nhưng không thành công ông thiết kế với một ngoại lệ. Bạn có thể sử dụng đoạn mã sau trong PropertyChangedCallback để có được những Image như một workaround

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

Cảm ơn bạn. Mã này biên dịch bây giờ, tuy nhiên tôi vẫn không nhìn thấy hình ảnh. Tôi khá chắc chắn nó vì CallBack của tài sản đính kèm là sản phẩm nào. Tuy nhiên, "DependencyObject d" có chính nút đó. Tôi không hiểu ... – Houman

+0

Tôi chỉ nhận thấy câu hỏi của bạn có cả hai thẻ WPF và Silverlight, câu trả lời của tôi là cho WPF. Tôi sẽ thử nó cho Silverlight. –

+0

Bạn nói đúng. xin lỗi. Tôi nghĩ về các thuộc tính đính kèm chúng sẽ không khác nhau. :) – Houman

Các vấn đề liên quan