2010-06-14 11 views
10

मैं कोई समस्या नहीं के साथ अपने एप्लिकेशन के कई संस्करण के लिए कोड का एक ही बिट का उपयोग किया गया है, लेकिन मैं अब रहस्यमय तरीके से निम्नलिखित के साथ NullRerefenceException रों प्राप्त कर रहा हूँ:GetAdornerLayer रहस्यमय तरीके से लौटने अशक्त

this.Loaded += delegate { 
    deleteBrush = new DeleteBrushAdorner(background); 
    AdornerLayer al = AdornerLayer.GetAdornerLayer(background); 
    al.Add(deleteBrush); // null ref here?? 
}; 

background बस है एक तत्व।

मेरे दो विचार यह हो सकता है कि यह क्या हो सकता है ए) .NET 4.0 पर स्विच करना, और बी) ItemsControl में उपर्युक्त तत्व (जो UserControl है) के उदाहरण डाल रहा है।

विचित्र रूप से यह हर समय नहीं होता है, और यह अनुमान करना कठिन होता है कि यह कब होगा, इसलिए यह विश्वसनीय नहीं है।

उत्तर

8

AdornerLayer.GetAdornerLayer के लिये दस्तावेज निर्दिष्ट करें:

कोई adorner परतों पाए जाते हैं, विधि अशक्त देता है।

तो मेरा अनुमान है कि कोई सजावट परत नहीं है ... क्या आपके पास यह मानने का कोई कारण है कि यह मामला नहीं होना चाहिए? वर्तमान में आप किस गारंटी पर निर्भर हैं कि दृश्य पेड़ में एक सजावट परत होगी?

+2

एक ही बात होती है, हालांकि मैं अब MSDN के अनुसार देखें कि यह "एक adorner परत तत्वों के लिए * * यह दृश्य पेड़ में प्रदान करता है के नीचे।" मुझे एक एडॉर्नरलेयर में सीमा को लपेटने की कोशिश करें ... – devios1

+0

अभी तक इतना अच्छा है, वास्तव में। बेवकूफ सवाल के लिए खेद है: $ – devios1

3

मुझे उत्सुकता है कि यह वास्तव में हल किया गया था या नहीं। एक एडॉर्नर डिकोरेटर इसके नीचे तत्व के लिए एक एडॉर्नर लेयर प्रदान करता है - और सबकुछ इसके नीचे होगा। यह एक सजावटी है, जिसका अर्थ है कि इसमें एक बच्चा है जो सामग्री है। उस सामग्री को एडॉर्नरलेयर के साथ प्रदान किया जा रहा है। इसलिए, यदि आप अपने एक्सएएमएल में एक एडॉर्नर डिकोरेटर डालते हैं और बच्चा सीमा है, तो सीमा में एडॉर्नरलेयर होता है।

इसके अलावा, विंडो एक एडॉर्नर डिकोरेटर को दृश्य पेड़ के शीर्ष के रूप में परिभाषित करती है, इसलिए विंडो में किसी भी तत्व के ऊपर एक एडॉर्नर लेयर होगा। तो, यदि उपरोक्त आपकी सहमति खिड़की में थी ...

+2

समाधान समाप्त करने वाला समाधान केवल दृश्य के पेड़ में 'सीमा' के ऊपर * (यानी माता-पिता के रूप में) 'एडोर्नर डिकोरेटर * * डालना था। वास्तव में यह एक खिड़की में था, हालांकि एक क्रोमलेस एक था, लेकिन शायद यह .NET 4 के साथ एक मुद्दा है क्योंकि यह .NET 3.5 में 'एडॉर्नर डिकोरेटर' के बिना ठीक काम करता है। – devios1

+0

मुझे एक ही समस्या थी। मैं एक खिड़की के अंदर नियंत्रणों को सजाने की कोशिश कर रहा था, लेकिन GetAdornerLayer शून्य वापस लौटा, इससे कोई फर्क नहीं पड़ता कि मैं adorner परत पाने के लिए क्या कोशिश कर रहा था। – kubal5003

9

मुझे पता है कि यह एक पुराना सवाल है लेकिन मुझे आज यह समस्या थी।

मेरे मामले में मेरे पास एक कक्षा थी जो Window और GetAdornerLayer() पर आधारित है। यह पता चला कि मेरे व्युत्पन्न वर्ग के लिए ControlTemplate में AdornerDecorator नहीं था। इसे जोड़कर ControlTemplate में शीर्ष स्तर के रूप में समस्या हल हो गई। अगर मैं एक `एक` Border` के बजाय AdornerDecorator` का उपयोग

<Style TargetType="my:MyWindow" BasedOn="{StaticResource {x:Type Window}}"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="my:MyWindow"> 
       <AdornerDecorator> 
       <DockPanel ...> 
       </DockPanel> 
       </AdornerDecorator> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
संबंधित मुद्दे