24

मैंने एक बटन स्टाइल के भीतर एक छवि बनाई है। अब मैंने एक संलग्न संपत्ति बनाई है ताकि मैं उस छवि के लिए स्रोत सेट कर सकूं। सीधे आगे होना चाहिए लेकिन मैं इसके साथ अटक गया हूँ।एक शैली के भीतर संलग्न संपत्ति का उपयोग कैसे करें?

यह मेरा छोटा ButtonStyle है:

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

और यह संलग्न संपत्ति परिभाषा है, ध्यान दें मैं, पता नहीं कैसे कॉलबैक ठीक करने के लिए है कि के रूप में DependencyProperty बटन के बजाय छवि हो रहा है। और बटन मेरी छवि को अपनी शैली के भीतर बेनकाब नहीं करता है। यह युक्तियुक्त है।

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

कोई भी विचार करें:

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

यह कैसे मैं XAML भीतर छवि स्रोत सेट किया गया है? कई धन्यवाद,

+0

मुझे लगता है कि मैं जवाब के रूप में प्राप्त करने के लिए Image PropertyChangedCallback में निम्नलिखित कोड का उपयोग कर सकते जल्द ही यहां के लिए, आप एक सेटर के माध्यम से गुण सेट करने के लिए और फिर टेम्पलेट के भीतर करने के लिए बाध्य करना चाहते हैं? –

+0

दृश्य इस तरह के टूलबार के चार बटन का प्रतिनिधित्व करता है: http://sl.venuscloud.com/ मैं संलग्न संपत्ति के माध्यम से दृश्य से प्रत्येक बटन को आइकन से आइकन को इंजेक्ट करना चाहता हूं। उम्मीद है कि यह और अधिक स्पष्ट बनाता है। धन्यवाद – Houman

उत्तर

37

यहाँ कैसे आप एक शैली

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

में अपने जुड़ी संपत्ति सेट कर सकते हैं जब संलग्न गुण के लिए बाध्य तो पथ कोष्ठकों के भीतर हो तो TemplatedParent बजाय

साथ बाइंडिंग RelativeSource उपयोग करने के लिए प्रयास करना चाहिए है
<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> 

संपादित करें: ऊपर कोड क्रम में Image शो WPF में काम करता है, Silverlight में लेकिन यह टी में विफल रहता है वह एक अपवाद के साथ डिजाइनर। आप एक समाधान

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

धन्यवाद। यह कोड अब संकलित करता है, हालांकि मैं अभी भी छवियों को नहीं देखता हूं। मुझे पूरा यकीन है क्योंकि संलग्न संपत्ति का कॉलबैक खाली है। हालांकि "निर्भरता ऑब्जेक्ट डी" बटन ही है। मैं समझ नहीं पा रहा हूं ... – Houman

+0

मैंने अभी देखा है कि आपके प्रश्न में डब्ल्यूपीएफ और सिल्वरलाइट टैग दोनों थे, मेरा जवाब WPF के लिए था। मैं सिल्वरलाइट के लिए कोशिश करूँगा। –

+0

आप सही हैं। क्षमा याचना। मैंने संलग्न गुणों के बारे में सोचा कि वे अलग नहीं होंगे। :) – Houman

संबंधित मुद्दे