2010-05-31 13 views
5

पर कोई घटना पारित नहीं हुई है, मैं डब्ल्यूपीएफ में एक अच्छा "ड्रैग और ड्रॉप जोन" बनाने की कोशिश कर रहा हूं जो मुख्य एप्लिकेशन में खींचा जाने पर एडोर्नर परत में प्रदर्शित होता है। समस्या यह है कि मुझे अपने सजावट से कोई घटना नहीं मिलती है, भले ही दस्तावेज़ीकरण के अनुसार यह सभी इनपुट घटनाओं को प्राप्त करे, क्योंकि यह उच्च जेड-ऑर्डर में है।डब्ल्यूपीएफ एडॉर्नर परत

मेरी समस्या को डीबग करने के लिए मैंने एक बहुत ही सरल उदाहरण बनाया जहां मेरे पास केवल एक बटन के साथ उपयोगकर्ता नियंत्रण है। यह उपयोगकर्ता नियंत्रण adorner परत में प्रदर्शित होता है, लेकिन मैं बटन पर क्लिक नहीं कर सकता। क्यूं कर? मैंने क्या गल्त किया है?

मेरे adorner वर्ग इस तरह का निर्माण किया है:

public ShellOverlayAdorner(UIElement element, AdornerLayer adornerLayer) 
     :base(element) 
    { 
     _adornerLayer = adornerLayer; 

     _overlayView = new AdornedElement(); 
     _overlayView.AllowDrop = true; 
     _adornerLayer.Add(this); 
    } 

और द्वारा

private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     adornerLayer = AdornerLayer.GetAdornerLayer(MyTopGridWithButtonInIt); 
     ShellOverlayAdorner shell = new ShellOverlayAdorner(MyTopGridWithButtonInIt, adornerLayer); 

    } 

मुख्य विंडो में बनाई गई है मैं किसी भी घटनाओं मेरे नियंत्रण से बिल्कुल भी नहीं मिलता है, कोई माउस क्लिक यानी , माउस ओवर, बटन क्लिक। मैं adorner परत में बटन भी क्लिक नहीं कर सकता। मैंने क्या गल्त किया है?

+1

यह मेरे लिए ठीक काम कर रहा है ... आप अपने adorner पर गलत पर IsHitTestVisible सेट नहीं किया क्या आप वाकई रहे हैं? –

+0

हमम .. अजीब, क्योंकि मैं इसे बनाने वाली सभी परीक्षण परियोजनाओं के लिए यह प्राप्त करता हूं। नहीं, मैंने IsHitTestVisible को गलत पर सेट नहीं किया है। मैंने परिवर्तन करने के लिए इसे सही और गलत दोनों पर सेट करने का परीक्षण किया है, लेकिन कुछ भी नहीं होता है। – Johanna

उत्तर

11

मुझे नहीं पता कि आपने पहले ही यह कोशिश की है कि: यदि आप तत्वों पर प्रतिक्रिया करने के लिए तत्व जोड़ना चाहते हैं, तो मुझे लगता है कि तत्व को सजावट के दृश्य पेड़ से बंधना चाहिए। जिस तरह से यह करने के लिए एक VisualCollection, adorner ही intitialized उपयोग करने के लिए है, या कम से कम, इस तरह से यह लगता है काम करने:

VisualCollection visualChildren; 
    FrameworkElement @object; 

    public CustomAdorner(UIElement adornedElement) : 
     base(adornedElement) 
    { 
     visualChildren = new VisualCollection(this); 
     @object = new Button {Content = "prova"}; 
     visualChildren.Add(@object); 
    } 
    protected override Visual GetVisualChild(int index) 
    { 
     return visualChildren[index]; 
    } 

इस तरह की घटनाओं को सही ढंग से रूट किया जाता है।

1

मुझे बस एक ही समस्या थी। एमएसडीएन से सलाह के बाद इसे मेरे लिए क्रमबद्ध किया गया:

एडॉर्नर्स इनपुट घटनाओं को किसी भी अन्य फ्रेमवर्क एलिमेंट की तरह प्राप्त करते हैं। क्योंकि एक adorner हमेशा तत्व यह सजाया तुलना में एक उच्च ज़ेड-ऑर्डर है, adorner (जैसे ड्रॉप या MouseMove के रूप में) के इनपुट ईवेंट कि अंतर्निहित सजी तत्व के लिए लक्षित किया जा सकता है प्राप्त करता है। एक एडोर्नर कुछ इनपुट इवेंट्स सुन सकता है और इन्हें पर द्वारा अंतर्निहित सजे हुए तत्व पर ईवेंट को फिर से उठा सकता है।

पास के माध्यम से एक adorner तहत तत्वों का परीक्षण मारा, adorner पर गलत पर हिट परीक्षण IsHitTestVisible गुण सेट सक्षम करने के लिए।

यानी adorner ही में, सुनिश्चित करें IsHitTestVisible = false

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