2010-12-03 10 views
9

मैं कुछ XAML मार्कअप है कि इस तरह अनिवार्य रूप से दिखता है से अधिक है:WPF - निर्धारण करता है, तो माउस एक UIElement

<Canvas x:Name="A"> 
    <Canvas x:Name="B"/> 
</Canvas> 

मैं अगर माउस बी

जब मैं थोड़ी देर के लिए क्लिक करें Canvas खत्म हो गया है निर्धारित करने के लिए चाहते हैं मेरा माउस कैनवास बी, माउस पर है। प्रत्यक्ष रूप से कैनवास ए लौटाता है (जैसा कि मुझे उम्मीद है)। इसके बाद मैं कैनवास ए से कैनवास बी का संदर्भ प्राप्त करता हूं लेकिन जब मैं कैनवास बी की IsMouseOver संपत्ति की जांच करता हूं तो यह झूठा होता है।

यह निर्धारित करने का सबसे अच्छा तरीका क्या है कि माउस कैनवास बी से ऊपर है xaml ऊपर दिया गया है?

+0

आपकी जांच करने के लिए आप किस ईवेंट हैंडलिंग का उपयोग कर रहे हैं? यदि मैं कैनवास बी में माउसअप ईवेंट जोड़ता हूं तो माउस। डायरेक्टली ओवर कैनवास बी वापस कर रहा है। शायद थोड़ी अधिक जानकारी आपकी समस्या को ट्रैक करने में मदद करेगी। – Liz

+0

निश्चित रूप से। कैनवास वास्तव में ListBoxItem के लिए ControlTemplate में है। मैं सूची बॉक्स के चयन को बदल रहा हूं, और पॉप-अप दिखाने के लिए एक रूटेड ईवेंट निष्पादित कर रहा हूं, जो क्लिक किए गए आइटम के बारे में जानकारी देता है। कोड जहां मैं जांचता हूं कि माउस कहां खत्म हो गया है, रूटेड इवेंट हैंडलर में है। इन सब का लक्ष्य पॉप-अप नहीं दिखाना है जब सूची आइटम के दाईं ओर भाग क्लिक किया जाता है। इसलिए मैं सूची आइटम के उस भाग को कैनवास के साथ परिभाषित करने का प्रयास कर रहा हूं, फिर यह देखने के लिए जांच कर रहा हूं कि पॉपअप दिखाने से पहले आइटम के उस भाग पर माउस है या नहीं। –

+0

मुझे पता है कि ऐसा करने के अन्य तरीके हैं, लेकिन मैं चयन में बदलाव के अलावा कुछ और उपयोग करने से बचने की कोशिश कर रहा हूं। –

उत्तर

0

क्या आपने कैनवास बी के पृष्ठभूमि रंग को सेट करने की कोशिश की है? यह Transparent को खाली, यह चूक छोड़ दिया और क्लिक किया जाता है तो घटनाओं के माध्यम से यह

+0

हां मैंने कोशिश की है। मेरा कैनवास बी इस तरह दिखता है: <कैनवास x: नाम = "क्लिकफिल्टर" पृष्ठभूमि = "लाल" अस्पष्टता = "5" IsHitTestVisible = "True" Panel.ZIndex = "9999"> –

+0

मैं इसे deving करते समय लाल रंग में सेट करता हूं इसलिए मुझे यकीन था कि मैं इसकी सीमाओं में क्लिक कर रहा था। –

+0

मुझे तब नहीं पता ... यह मेरे लिए ठीक काम कर रहा है। मेरे पास 2 आइटमों की सूची बॉक्स वाली विंडो है। ListBox.Template आपके पास 2 कैनवस पर सेट है, और माउस का परीक्षण कर रहा हूं। डायरेक्टली सूची ऑब्जेक्ट में ListBox.SelectionChanged ईवेंट और यह सही परिणाम लौटा रहा है। – Rachel

3

मैं यहाँ एक जवाब मिला पारित पर इतना है कि आप की मदद करनी चाहिए: StackOverflow: WPF Ways to find controls

बस संदर्भ के लिए:

मैं सिर्फ लिए खोज रहा था यह पता लगाने के लिए एक तरह से करने के लिए अगर मेरे माउस मेरी अनुप्रयोगों खिड़की पर सब पर है, और मैं सफलतापूर्वक इस बाहर का उपयोग कर पाया:

if (Mouse.DirectlyOver != null) 
    DoSomethingNice(); 

जबकि डिबगिंग Mouse.DirectlyOver यह है कि यह अपने सी पाया है चाहिए लग रहा था एन्वास बी, क्योंकि यह सबसे ऊपर तत्व की तलाश में है - इसलिए आपका उदाहरण काम करना चाहिए। यह मुझे एक निर्भरता वस्तु नहीं दिया है, लेकिन मुझे लगता है कि तुम सिर्फ उपयोग करते हुए इस codebehind (untested) है अपने कैनवास के साथ उसकी तुलना कर सकते हैं:

if (Mouse.DirectlyOver == this.B) 
    DoSomethingNice(); 
21

आप IsMouseOver property उपयोग कर सकते हैं, तो माउस एक खत्म हो गया है निर्धारित करने के लिए दिए गए नियंत्रण है या नहीं: काम कर सकते हैं

if(this.B.IsMouseOver) 
    DoSomethingNice(); 

जबकि Mouse.DirectlyOver, अगर माउस Canvas द्वारा निहित एक नियंत्रण खत्म हो गया है, कि नियंत्रण Canvas खुद के बजाय लौटा दी जाएगी। IsMouseOver इस मामले में भी ठीक से काम करेगा।

+0

ध्यान दें कि ड्रैग और ड्रॉप ऑपरेशंस के दौरान आपको मैन्युअल रूप से 'IsMouseOver' और' DirectlyOver' का पता लगाना होगा, क्योंकि बूंद खत्म होने तक माउस को कैप्चर किया जाता है। उन लोगों के लिए जो नहीं जानते हैं, यह जांच कर किया जा सकता है कि माउस 'IsMouseOver' के लिए नियंत्रण की सीमाओं के भीतर है और 'DirectlyOver' के लिए' VisualTreeHelper.HitTest' का उपयोग कर रहा है। –

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