2011-02-10 10 views
5

नहीं कहा जा रहा है मैंने UIElements को खींचने के लिए एक कस्टम व्यवहार (मिश्रण के बिना) बनाया है और कर्सर के नीचे जो खींच रहे हैं उसका पारदर्शी थंबनेल प्राप्त कर रहा है (मिश्रण संस्करण लक्ष्य वस्तु को स्थानांतरित करता है जो कि नहीं है मुझे चाहिए)सिल्वरलाइट व्यवहार ऑनडेटिंग ओवरराइड को

Anyhoo, कोड वास्तव में बहुत ही सरल है और अच्छी तरह से काम करता है, मेरी समस्या यह है कि ऑनडेटिंग() को नहीं कहा जा रहा है, जिसका अर्थ है कि UIElement पर मेरी घटनाओं को अनदेखा नहीं किया जा रहा है।

यह मुझे थोड़ा चिंतित करता है क्योंकि मैं एकमात्र कारण अनुमान लगा रहा हूं कि व्यवहार को अलग क्यों नहीं किया जा रहा है क्योंकि यह अभी भी किसी चीज़ द्वारा संदर्भित किया जा रहा है। यह UIElement नहीं होना चाहिए, हालांकि यह एक चरण में इसके साथ रिसाव की समस्या थी, लेकिन अब हमने उन्हें हल किया है और यह WinDbg के माध्यम से स्पष्ट किया गया है।

इसके बारे में एकमात्र दिलचस्प (?) बात यह है कि व्यवहार किसी आइटम के नियंत्रण में किसी छवि से जुड़ा हुआ है, लेकिन इससे कोई फर्क नहीं पड़ता है? - forums.silverlight.net/forums/p/142038/

public class DragBehavior : Behavior<UIElement> 
{ 
    private const double DRAG_DISTANCE = 20; 
    private const int DRAG_ICON_HEIGHT = 100; 

    Point m_firstPoint; 
    private bool m_isDragging = false; 
    private Popup m_dragPopup = null; 
    private Image m_draggedImage;   

    protected override void OnAttached() 
    { 
     this.AssociatedObject.MouseLeftButtonDown += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown); 
     this.AssociatedObject.MouseMove += new MouseEventHandler(AssociatedObject_MouseMove); 
     this.AssociatedObject.MouseLeftButtonUp += new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp); 

     base.OnAttached(); 
    } 

    void AssociatedObject_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
    { 
     m_firstPoint = e.GetPosition(null); 
     m_isDragging = true; 
    } 

    void AssociatedObject_MouseMove(object sender, MouseEventArgs e) 
    { 
     if (m_isDragging) 
     { 
      Point currentPosition = e.GetPosition(null); 

      if (m_dragPopup == null) 
      { 
       double deltaX = currentPosition.X - m_firstPoint.X; 
       double deltaY = currentPosition.Y - m_firstPoint.Y; 

       double movement = Math.Sqrt((deltaX * deltaX) + (deltaY * deltaY)); 
       if (movement > DRAG_DISTANCE) 
       { 
        // Get a screen shot of the element this behaviour is attached to 
        WriteableBitmap elementScreenshot = new WriteableBitmap(AssociatedObject, null); 

        // Create an image out of it 
        m_draggedImage = new Image(); 
        m_draggedImage.Height = DRAG_ICON_HEIGHT; 
        m_draggedImage.Stretch = Stretch.Uniform; 
        m_draggedImage.Source = elementScreenshot; 
        m_draggedImage.Opacity = 0.4; 

        // Add the image to the popup 
        m_dragPopup = new Popup(); 
        m_dragPopup.Child = m_draggedImage; 

        m_dragPopup.IsOpen = true; 
        m_dragPopup.UpdateLayout(); 

        m_dragPopup.HorizontalOffset = currentPosition.X - m_draggedImage.ActualWidth/2; 
        m_dragPopup.VerticalOffset = currentPosition.Y - m_draggedImage.ActualHeight/2; 

        AssociatedObject.CaptureMouse(); 
       } 
      } 
      else 
      { 
       m_dragPopup.HorizontalOffset = currentPosition.X - m_draggedImage.ActualWidth/2; 
       m_dragPopup.VerticalOffset = currentPosition.Y - m_draggedImage.ActualHeight/2; 
      } 
     } 
    } 

    void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
    { 
     if (m_isDragging == true && m_dragPopup != null) 
     { 
      m_isDragging = false; 
      m_dragPopup.IsOpen = false; 
      m_dragPopup = null; 
     } 

     AssociatedObject.ReleaseMouseCapture(); 

     GC.Collect(); 
     GC.WaitForPendingFinalizers(); 
     GC.Collect(); 
    } 

    protected override void OnDetaching() 
    { 
     this.AssociatedObject.MouseLeftButtonDown -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonDown); 
     this.AssociatedObject.MouseMove -= new MouseEventHandler(AssociatedObject_MouseMove); 
     this.AssociatedObject.MouseLeftButtonUp -= new MouseButtonEventHandler(AssociatedObject_MouseLeftButtonUp); 

     base.OnDetaching(); 
    } 
} 

मैं दो पदों जो मैं इस बारे में देखा है के बारे में पता ...

यह एक:

यहाँ मेरे वर्तमान कोड है 317146.aspx मदद नहीं करता है क्योंकि मैंने जीसी को कोई लाभ नहीं पहुंचाया है, और यह एक - Automatically calling OnDetaching() for Silverlight Behaviors मुझे वास्तव में उनकी व्याख्या नहीं मिलती है क्योंकि वे दावा करते हैं कि यूआईएलमेंट की वजह से इसका व्यवहार होता है, लेकिन इसका कारण बनता है, लेकिन निश्चित रूप से जब रूट संदर्भ UIElement टूटा हुआ है, तो व्यवहार के मूल संदर्भ को भी हटा दिया जाएगा और परिणामस्वरूप दोनों जीसी के लिए योग्य हो जाएंगे।

मुझे उम्मीद थी कि यह आसान होगा, लेकिन यदि नहीं, तो मैं वास्तव में क्या चल रहा है यह देखने के लिए WinDbg से शुरू करूंगा!

किसी भी मदद की बहुत सराहना की है! :)

धन्यवाद,

एंडी।

+1

कोई भी मदद नहीं कर सकता है? मान लीजिए मैं चांदी के मंचों में सकारात्मक कोशिश करूँगा! अगर मैं कहीं भी जाऊं तो मैं इस थ्रेड को अपडेट करूंगा! – Andy

उत्तर

0

आप यह नहीं दिखाते कि डिटेच कहां से बुलाया जा रहा है। वास्तव में ऑब्जेक्ट को कॉल करने की आवश्यकता है। OnDetaching() विधि के लिए डेटा() (DragBehavior) को कॉल करें।

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

void AssociatedObject_MouseLeftButtonUp(object sender, MouseButtonEventArgs e) 
{ 
    if (m_isDragging == true && m_dragPopup != null) 
    { 
     m_isDragging = false; 
     m_dragPopup.IsOpen = false; 
     m_dragPopup = null; 
    } 

    AssociatedObject.ReleaseMouseCapture(); 

    this.Detach() 
} 

मैं निश्चित रूप से जीसी को कोई कॉल नहीं करूँगा जिसका एक बड़ा प्रदर्शन प्रभाव हो सकता है।

+4

मुझे लगता है कि वह वह मुद्दा है जो वह बना रहा है। जब दृश्य दृश्य पेड़ से दृश्य हटा दिया जाता है तो सिल्वरलाइट को 'डिटेच' कहा जाना चाहिए। –

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