2012-09-28 11 views
5

मैंने सी #/एक्सएएमएल का उपयोग कर एक विंडोज 8 स्टोर ऐप बनाया है। मेरे इंटरफ़ेस में स्क्रोल करने योग्य सूची शामिल है, जिसे ScrollViewer का उपयोग करके प्रस्तुत किया जाता है। मैं सूची में तत्वों पर हेरफेर घटनाओं को संभालने में सक्षम होना चाहता हूं, हालांकि, सूची तत्व पर के अलावा ManipulationMode को सेट करने से मेरी सूची अब स्क्रॉल नहीं कर सकती है।स्क्रॉलव्यूयर और बाल तत्वों पर हेरलिंग मैनिपुलेशन घटनाएं

यहाँ यूआई का एक सरलीकृत संस्करण है:

<ScrollViewer> 
    <Border/> <!-- these contain child content --> 
    <Border/> 
    <Border/> 
    <!-- Set ManipulationMode on an element in order to receive manipulation events --> 
    <!-- This causes the scroll viewer to stop working! --> 
    <Border ManipulationMode="All" 
      ManipulationDelta="..."/> 
    <Border/> 
    <Border/> 
</ScrollViewer> 

मैं समझता हूँ कि WinRT ScrollViewer प्रदर्शन कारणों से System की एक विशेष ManipulationMode का उपयोग करता है, लेकिन मैं एक खड़ी स्क्रॉल सूची करना चाहते हैं, तत्वों से युक्त है कि क्षैतिज हेरफेर/इशारे का जवाब दें। क्या कोई रचनात्मक कामकाज के बारे में सोच सकता है जिससे यह संभव हो सके?

उत्तर

8

मैंने जो किया है, मैंने स्क्रॉलव्यूयर के शीर्ष पर एक पारदर्शी आयताकार रखा और वहां कुशलतापूर्वक संभाल लिया। जब मुझे लगता है कि हेरफेर को स्क्रॉलव्यूयर स्क्रॉल करना चाहिए - मैं ScrollToHorizontal/VerticalOffset() विधियों का उपयोग करके स्क्रॉलव्यूयर स्क्रॉल करता हूं। मैनिपुलेशन स्टार्टेड पर मैं VisualTreeHelper.FindElementsInHostCoordinates का भी उपयोग करता हूं यह जांचने के लिए कि मैं कौन सा आइटम मैनिप्लेट कर सकता हूं और फिर मैं तय कर सकता हूं कि उस आइटम में हेरफेर करना है या नहीं, विभिन्न स्थितियों के आधार पर। यद्यपि यह कस्टम कोड का थोड़ा सा है। स्क्रॉलव्यूयर में स्क्रॉलकंटेंट प्रिंटर के रेंडरट्रांसफॉर्म को अपडेट करने की भी आवश्यकता होगी जब उपयोगकर्ता स्क्रॉलव्यूयर डिफ़ॉल्ट व्यवहार को इमेट करने के लिए न्यूनतम/अधिकतम ऑफसेट से आगे खींचने का प्रयास करता है, माउस स्क्रोलव्हील इत्यादि को संभालने के लिए कुछ भी नहीं। आप कुछ भी नहीं कर सकते हैं। दुर्भाग्यवश मुझे बेहतर तरीके से नहीं मिला और मुझे कोई दिलचस्पी है यदि कोई व्यक्ति पाता है।

संपादित करें * another similar question का उत्तर देने का प्रयास करने के बारे में मैंने सोचा था कि एक अन्य स्क्रॉल व्यूअर को बाल आइटम के रूप में उपयोग करना था और मैनिपुलेशन घटनाओं के बजाय इसके व्यू चेंज किए गए ईवेंट का उपयोग करना था।

संपादित 2 *

इसके अलावा Windows 8.1 के साथ आप ManipulationModes.System जो अन्य साधनों के साथ संयुक्त प्राप्त यदि आप एक ScrollViewer के अंदर जोड़तोड़ को संभालने के लिए अनुमति चाहिए। पैन & ज़ूम के लिए मैनिप्लेशंस प्रोसेसिंग को रोकने के लिए आप अपने माता-पिता ScrollViewers को एक बार मैनिपुलेटेड तत्व पर CancelDirectManipulations() पर कॉल कर सकते हैं।

+0

वाह - यह बहुत काम है। तो आप मूल रूप से 'स्क्रॉलव्यूअर' को स्क्रॉल करने का ख्याल रखते हैं? क्या इसका मतलब यह है कि आपको अपनी जड़ता की गणना भी करनी है ताकि वह स्वाभाविक रूप से स्क्रॉल हो सके? या जब आप लंबवत ऑफसेट बदलते हैं तो यह स्वचालित रूप से ऐसा करता है? – ColinE

+1

बृहस्पति में कुशलताएं अंतर्निहित अंतर्निहित जड़ता है, इसलिए आप इसे कवर करते हैं। अगर आपको जड़ता के कारण स्क्रॉलिंग होती है तो आपको केवल यह सुनिश्चित करने की ज़रूरत है कि आप सूची के अंत में स्क्रॉलकंटेंट प्रतिनिधि को स्क्विश न करें। मैनिपुलेशन आमतौर पर बहुत चिकनी होते हैं, लेकिन स्क्रॉल व्हील का उपयोग करते समय स्क्रॉलिंग को सुगम बनाने के लिए आप शायद [WinRT XAML Toolkit] (http://bit.ly/WinRTXamlToolkit) से स्क्रॉलव्यूयर एनिमेशन का उपयोग कर सकते हैं। बीटीडब्ल्यू, मैं उल्लेख करना भूल गया था कि जब आप ओवरले पर टैप करते हैं तो आप आइटम पर सेटिंग फ़ोकस को भी संभालना चाहते हैं ... :) –

+1

@ कोलिने [मेरा प्रश्न] [http: // stackoverflow] का जवाब दें।कॉम/प्रश्न/14153038/कैसे-से-अनुमति-कुशलता-भीतर-सूचीदृश्य-ग्रिडव्यू-आइटम-नियंत्रण-जबकि-अनुमति/14161596 # 14161596) किसी अन्य समाधान के लिए। –

10

यह लंबे समय तक हो सकता है लेकिन कोई अच्छा समाधान नहीं मिला। मैंने अभी हासिल किया जो मैं बहुत आसानी से चाहता था।

public MovableGrid() 
     { 
      ManipulationMode = ManipulationModes.TranslateX | ManipulationModes.System; 
      AddHandler(ManipulationDeltaEvent, new ManipulationDeltaEventHandler(UIElement_OnManipulationDelta), true); 
      AddHandler(ManipulationCompletedEvent, new ManipulationCompletedEventHandler(UIElement_OnManipulationCompleted), true); 
     } 

मैं एक्स अक्ष पर स्थानांतरित करने की मेरी MovableGrid चाहता था और मैं MovableGrids जो मैं ScrollViewer के साथ स्क्रॉल किया जा करने के लिए चाहता था की सूची है। ऐसा करने के लिए पर्याप्त है।

+0

के साथ काम नहीं कर सकता धन्यवाद! मुझे ठीक इसी की आवश्यकता थी! – Pam

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