2012-05-22 19 views
9

पर स्टाइल ट्रिगर को अपडेट करने के लिए संलग्न संपत्ति मैं एक ईवेंट को निकाल दिए जाने पर UIElement पर शैली परिवर्तन को ट्रिगर करने के लिए एक संलग्न संपत्ति का उपयोग करने का प्रयास कर रहा हूं।घटना

यहाँ स्थिति है:

एक उपयोगकर्ता एक TextBox देखता है, और फिर केंद्रित यह unfocuses। किसी संलग्न संपत्ति में कहीं भी यह LostFocus ईवेंट नोटिस करता है और यह कहता है कि यह HadFocus है।

टेक्स्टबॉक्स पर शैली तब जानता है कि इसे इस HadFocus प्रॉपर्टी के आधार पर अलग-अलग शैली बनाना चाहिए।

यहाँ कैसे मैं मार्कअप देखने के लिए कल्पना है ...

<TextBox Behaviors:UIElementBehaviors.ObserveFocus="True"> 
<TextBox.Style> 
    <Style TargetType="TextBox"> 
     <Style.Triggers> 
      <Trigger Property="Behaviors:UIElementBehaviors.HadFocus" Value="True"> 
       <Setter Property="Background" Value="Pink"/> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</TextBox.Style> 

मैं संलग्न गुण के कुछ संयोजन की कोशिश की है इस काम के प्राप्त करने के लिए, मेरे नवीनतम प्रयास फेंकता एक XamlParseException बताते हुए "संपत्ति ट्रिगर पर शून्य नहीं हो सकती है।"

public class UIElementBehaviors 
{ 
    public static readonly DependencyProperty ObserveFocusProperty = 
     DependencyProperty.RegisterAttached("ObserveFocus", 
              typeof (bool), 
              typeof (UIElementBehaviors), 
              new UIPropertyMetadata(false, OnObserveFocusChanged)); 
    public static bool GetObserveFocus(DependencyObject obj) 
    { 
     return (bool) obj.GetValue(ObserveFocusProperty); 
    } 
    public static void SetObserveFocus(DependencyObject obj, bool value) 
    { 
     obj.SetValue(ObserveFocusProperty, value); 
    } 

    private static void OnObserveFocusChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var element = d as UIElement; 
     if (element == null) return; 

     element.LostFocus += OnElementLostFocus; 
    } 
    static void OnElementLostFocus(object sender, RoutedEventArgs e) 
    { 
     var element = sender as UIElement; 
     if (element == null) return; 

     SetHadFocus(sender as DependencyObject, true); 

     element.LostFocus -= OnElementLostFocus; 
    } 

    private static readonly DependencyPropertyKey HadFocusPropertyKey = 
     DependencyProperty.RegisterAttachedReadOnly("HadFocusKey", 
                typeof(bool), 
                typeof(UIElementBehaviors), 
                new FrameworkPropertyMetadata(false)); 

    public static readonly DependencyProperty HadFocusProperty = HadFocusPropertyKey.DependencyProperty; 
    public static bool GetHadFocus(DependencyObject obj) 
    { 
     return (bool)obj.GetValue(HadFocusProperty); 
    } 

    private static void SetHadFocus(DependencyObject obj, bool value) 
    { 
     obj.SetValue(HadFocusPropertyKey, value); 
    } 
} 

कोई भी मुझे निर्देशित करने में सक्षम है?

उत्तर

5

एक पठनीय निर्भरता संपत्ति को पंजीकृत करने का मतलब संपत्ति नाम पर Key जोड़ने का मतलब नहीं है। बस द्वारा

DependencyProperty.RegisterAttachedReadOnly("HadFocus", ...); 

HadFocus के बाद से संपत्ति का नाम है

DependencyProperty.RegisterAttachedReadOnly("HadFocusKey", ...); 

बदलें।

+0

यह ठीक है, आपकी मदद के लिए धन्यवाद: ओ) – mortware

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