2011-03-13 9 views
6

मैं प्रभावी रूप से यह निर्धारित करने के तरीकों की तलाश कर रहा हूं कि नियंत्रण वास्तव में दृश्यमान और क्लिक करने योग्य है या नहीं। मेरा मतलब वस्तु की दृश्यता संपत्ति की जांच से परे है।यह निर्धारित करना कि ऑब्जेक्ट दृश्यमान है और क्लिक करने योग्य

मैं रेंडरसाइज की जांच कर सकता हूं और यह [0,0] होगा यदि कोई भी मूल तत्व ढह गया है। तो यह भी आसान है। मैं भी दृश्य पेड़ पार और सभी तत्वों की अस्पष्टता के लिए 1.

सेट है, तो मैं अच्छी तरह से जाँच करने के लिए पता नहीं कैसे क्या देख सकते हैं इन परिदृश्य हैं:

  1. वस्तु से बाधित है कुछ अन्य ऑब्जेक्ट। स्पष्ट रूप से FindElementsInHostCoordinates() का उपयोग करना संभव है और यह पता लगाने के लिए कंप्यूटेशंस करें कि इन ऑब्जेक्ट्स में कितना बाधा आती है लेकिन यह एक ओवरकिल हो सकती है। मैं पूरे पृष्ठ के प्रश्न और "स्क्रीनशॉट" में ऑब्जेक्ट का "स्क्रीनशॉट" भी बना सकता हूं और जांच कर सकता हूं कि पिक्सल जहां मेरी ऑब्जेक्ट वास्तविक ऑब्जेक्ट पिक्सेल से मेल खाती है। यह भी एक ओवरकिल की तरह लगता है।
  2. ऑब्जेक्ट एक पारदर्शी ऑब्जेक्ट द्वारा बाधित है जो अभी भी "निगलता है" क्लिक (टैप्स)। पहली समस्या के लिए कामकाज अभी भी इस परिदृश्य में विफल हो सकता है।

अद्यतन (एक और परिदृश्य)

  1. वस्तु पैरेंट ऑब्जेक्ट/स्क्रीन की सीमा से बाहर है। क्या बहुत सारी गणनाओं को छोड़कर इसे खोजने का कोई और तरीका है?

कोई बेहतर विचार? क्या मुझे कुछ याद आती है?

धन्यवाद!

उत्तर

3

आप प्रोग्राम के दृश्यता और एक तत्व के HitTestVisible संपत्ति है, लेकिन इस परे आप वास्तव में परीक्षण नहीं कर सकते, तो एक क्लिक करें घटना तत्व को भेजा जाएगा या निगल लिया सब के ऊपर तत्वों द्वारा परीक्षण कर सकते हैं - क्योंकि अवरुद्ध या अग्रेषण क्लिक ईवेंट हैंडलर विधियों में हो सकते हैं जिन्हें आप सामान्य रूप से निर्धारित नहीं कर सकते हैं।

निम्न उदाहरण लें:

  • आप है कि यह
  • ChildElement पर एक ChildElement एक घटना इसे से जुड़े हैंडलर कि क्लिक करें घटना संभालती है अगर ParentElement पैनल क्लिक करने योग्य है परीक्षण करना चाहते हैं, यह दिखाई दे रहा है और इसकी HitTestVisible संपत्ति सत्य पर सेट है।
  • यह आप अभी तक तय नहीं कर सकता है, तो घटना ParentElement को भेजा जाएगा के आधार पर: ChildElement के क्लिक ईवेंट हैंडलर में यह सच करने के लिए घटना के Handled संपत्ति सेट कर सकते हैं कि ParentPanel घटना प्राप्त करना बंद होगा या इसे छोड़ सकता है झूठी बात पर, माता-पिता को घटना प्राप्त होती है।

इस प्रकार यदि कस्टम इवेंट हैंडलर शामिल हैं, तो आप निश्चित रूप से यह बताने में सक्षम नहीं होंगे कि कोई तत्व क्लिक करने योग्य है या नहीं। आप जितना अधिक कर सकते हैं Visiblity और IsHitTestVisible बच्चों और अभिभावक तत्वों पर गुणों की जांच करें और जांचें कि TransformToVisual विधि का उपयोग करके बच्चों/माता-पिता को एक दूसरे के सापेक्ष कहां प्रदान किया जाता है।

+0

धन्यवाद:

यहां नमूने समारोह है! मैंने एक और संदिग्ध परिदृश्य जोड़ा है। कोई विचार? –

0

आप VisualTreeHelper.FindElementsInHostCoordinates के लिए देख रहे हैं। लौटा पहला तत्व वह तत्व होगा जो माउस को उस पिक्सेल पर क्लिक/टैप करेगा। बेशक, जैसा कि गर्जली ने कहा था, आप यह नहीं बता सकते कि क्या तत्व क्लिक को अनदेखा कर देगा और इसे आपके पास भेज देगा।

// pass in a point and the UIElement that the point is relative to 
// (or null if the point is relative to the root visual) 
public static UIElement HitTest(Point p, UIElement relativeTo = null) 
{ 
    if (relativeTo != null) 
     p = relativeTo.TransformToVisual(Application.Current.RootVisual) 
    return VisualTreeHelper 
      .FindElementsInHostCoordinates(p, Application.Current.RootVisual) 
      .FirstOrDefault(); 
} 
संबंधित मुद्दे