2012-02-27 16 views
8

मैं एक स्क्रॉल व्यूअर की सामग्री के चारों ओर पैन करने का प्रयास कर रहा हूं, उसी तरह आप पीडीएफ दस्तावेज़ में घूमते हैं (ज़ूम इन/आउट करने के लिए स्क्रॉल करें, पैन पर खींचें + स्क्रॉल करें) स्क्रॉलव्यूयर इस कार्यक्षमता को टच इवेंट्स (पैनिंगमोड) के लिए बनाया गया है, हालांकि यह क्लिक + ड्रैग इवेंट्स में अनुवाद करने के लिए प्रतीत नहीं होता है। क्या इस कार्यक्षमता को मापने/अनुकरण करने का कोई तरीका है?माउस घटनाओं के साथ स्क्रॉलव्यूयर का पैनिंग मोड व्यवहार

उत्तर

2

Panning ScrollViewer द्वारा कार्यान्वित चार आभासी तरीके से आंतरिक रूप से सक्षम किया गया है:

OnManipulationCompleted OnManipulationDelta OnManipulationInertiaStarting और OnManipulationStarting

तो जहां इन आभासी तरीकों परिभाषित कर रहे हैं। आइए पदानुक्रम ऊपर जाओ। हम देखते हैं कि इसे OnManipulationCompletedThunk के भीतर UIElement पर कॉल किया गया है (मुझे यकीन है कि बाकी के लिए भी संयोगजनक तरीके हैं)।

सब कुछ इस बिंदु पर अभी भी निजी है, हम का दोहन करने के लिए कुछ करना चाहते हैं। दुर्भाग्य से इस बिंदु है जिस पर दोनों परावर्तक और ILSpy मुझे विफल रहा है (अच्छी तरह से वास्तव में यह नहीं, कॉल को किसी भिन्न dll (PresentationCore) है कि मैं BRB लोड नहीं है में है था) है। ठीक है वापस एक बार जब हम प्रेजेंटेशनकोर में देखते हैं, तो हमारे पास एक अस्पष्ट विचार है कि निर्भरता प्रॉपर्टीज स्थिर रूप से पंजीकृत हैं, इसलिए हम .cctor पाते हैं। यहां रुचि की कुछ पंक्तियां हैं।

ManipulationCompletedEvent = Manipulation.ManipulationCompletedEvent.AddOwner (typeof (UIElement));

और

EventManager.RegisterClassHandler (typeof (UIElement), ManipulationCompletedEvent, नई eventhandler (UIElement.OnManipulationCompletedThunk));

हम देखते हैं कि OnManipulationCompletedThunk इस वर्ग हैंडलर कि ManipulationCompletedEvent के लिए सुनता के लिए पंजीकृत कॉलबैक है। इसके अलावा, ManipulationCompletedEvent मूल रूप से UIElement पर परिभाषित नहीं किया गया है, इसे AddOwner के माध्यम से मैनिपुलेशन स्थिर वर्ग से उधार लिया जाता है।

हेरफेर वर्ग के लिए एक खोज करना, मुझे लगता है कि यह एक ही विधानसभा के भीतर System.Windows.Input नाम स्थान में है। क्या यह सार्वजनिक है, हाँ। ठंडा! तो इस बिंदु पर मुझे पता है कि अगर मैं मैनिपुलेशन कॉम्प्लेटेडएवेंट या उसके किसी भी दोस्त को आग लगाता हूं, तो अंततः यह स्क्रॉलव्यूअर में कॉल करेगा। http://msdn.microsoft.com/en-us/library/system.windows.input.manipulation.aspx

इस सार्वजनिक स्थैतिक वर्ग के लिए प्रलेखन में, मुझे लगता है कि दिलचस्प और संभवतः उपयोगी विधियों का एक गुच्छा है। केवल एक जो स्पष्ट रूप से स्पष्ट नहीं है AddManipulator है। यह बात क्या करती है? क्लिक .. पढ़ता है .. ओह, "प्रत्येक टच पॉइंट एक इमैनिपुलेटर ऑब्जेक्ट है। उदाहरण के लिए, यदि आप ऑब्जेक्ट का आकार बदलने के लिए दो अंगुलियों का उपयोग करते हैं, तो टचडिवाइस, जो इमैनिपुलेटर लागू करता है, प्रत्येक उंगली के लिए बनाया जाता है।" तो TouchDevice एक IManipulator है। हो सकता है कि मुझे अपना खुद का मैनिपुलेटर बनाने का तरीका बताएगा।

TouchDevice पर गुण सुविधाओं का समर्थन करता है के रूप में कुछ सुराग दे। यह एक माउसडिवाइस की तरह है (कैप्चर की अवधारणा है, डायरेक्टलीओवर इत्यादि), लेकिन यह उसी तरह हेरफेर का समर्थन नहीं करता है। इसके बजाय हम माउस घटनाओं के जवाब में मैनिपुलेशन करना चाहते हैं। चलो टचडिवाइस पर यह देखने के लिए कठिन लगते हैं कि यह वास्तव में इनमें से कुछ सुविधाओं को कैसे लागू करता है।

तरीकों TouchDevice लागू कर रहा है GetPosition कर रहे हैं और ManipultionEnded

GetPosition रिटर्न this.GetTouchPoint (relativeTo)।पद; relativeTo एक पैरामीटर

ManipulationEnded कॉल एक bool पैरामीटर रद्द नामित अग्रेषण OnManipulationEnded है। सुनिश्चित नहीं है कि अभी तक क्या रद्द है। ओह, यह पता चला है कि यह उपयोग नहीं किया जाता है, अजीब लेकिन ठीक है। यह मूल रूप से शून्य पर कब्जा सेट करता है। खरगोश छेद के अंत में Kindof तो हमें बैक अप और पुनर्मूल्यांकन करना होगा।

मैं वास्तव में करना चाहता हूं कि UIElement पर मैन्युअल रूप से ईवेंट उठाएं और देखें कि यह काम करता है या नहीं। UIElement पर RaiseEvent विधि इस के लिए काम करना चाहिए। ब्रब कोशिश करने जा रहा है। एरर प्रतीक्षा करें मुझे कुछ याद आया, मैनिपुलेशन क्लास पर परिभाषित सभी घटनाओं को आंतरिक के रूप में चिह्नित किया गया है।

स्पष्ट रूप से ये घटनाएं केवल आंतरिक खपत के लिए हैं, और प्रतिबिंब करने से कम हमारे पास एक एवेन्यू नहीं है।

मुझे लगता है कि मैनिपुलेशन सुविधा का उपयोग कर आप जो भी करने की कोशिश कर रहे हैं उसके लिए अधिक है। ड्रैग इवेंट और कैनवास के साथ इसे लागू करने का शायद एक तरीका है।

इसके अलावा, यह भी गुम हो गया और सोचा कि यह कुछ प्रासंगिकता हो सकता है http://multitouchvista.codeplex.com/

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