2010-09-26 12 views
13

मैं माइक्रोसॉफ्ट ब्लेंड के साथ विंडोज प्रेजेंटेशन फाउंडेशन कंट्रोल का निर्माण कर रहा हूं।डब्ल्यूपीएफ मूसडाउन => कोई माउसलेव इवेंट

जब मैं बाएं माउस-बटन दबाकर अपना नियंत्रण छोड़ देता हूं, तो माउसलेव-इवेंट नहीं उठाया जाता है। क्यों नहीं?

+0

में

my:Hooks.EnterCommand="{Binding EnterCommand}" my:Hooks.LeaveCommand="{Binding LeaveCommand}" my:Hooks.MouseMoveCommand="{Binding MoveCommand}" 

... अधिक जानकारी के लिए अपने नियंत्रण के अंदर क्या है? मैं सोच रहा हूं कि ऐसा इसलिए है क्योंकि वस्तु (उदा।एक बटन) माउसडाउन इवेंट प्राप्त करने वाले आपके नियंत्रण में "माउस। आईस्केप्चर" को सही करने के लिए सेट किया गया है, इसलिए यह विशेष रूप से MouseEvents को संभालने में सक्षम है। – ASanch

+0

यह सिर्फ एक सीमा, ग्रिड, छवि एक 2 लेबल है। क्या यह संभव है? –

+0

हम एक ही समस्या का सामना कर रहे हैं (प्रश्न देखें: http://stackoverflow.com/questions/15970248/wpf-mouse-leave-event-doesnt-trigger-with-mouse-down)। इसलिए मैंने ध्यान आकर्षित करने के लिए यहां एक इनाम शुरू कर दिया है। – SiberianGuy

उत्तर

7

यह इरादा है व्यवहार:

यहाँ लिंक के एक जोड़े हैं जब आप किसी नियंत्रण पर mousedown कर रहे हैं और नियंत्रण छोड़ रहा है, नियंत्रण अभी भी बरकरार रखती है इसके माउस पर "कैप्चर", जिसका अर्थ है कि नियंत्रण MouseLeave-Event को आग नहीं देगा। एक बार माउसबटन को नियंत्रण के बाहर छोड़ दिए जाने के बाद, माउस-अवकाश इवेंट को निकाल दिया जाएगा।

इससे बचने के लिए, आप सरल अपने नियंत्रण में सभी माउस कब्जा करने के लिए नहीं बता सकते हैं:

private void ControlMouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e) 
{ 
    Control control = (Control) sender; 
    control.Capture = false; //release capture. 
} 

अब mouseleave घटना भी सक्रिय किए जाएंगे, जब बाहर जाने, जबकि एक बटन दबाया जाता है।

आप नियंत्रण अंदर कैद की जरूरत है, तो आप और अधिक प्रयास में डाल की जरूरत है:

  • प्रारंभ mouseposition पर नज़र रखने के लिए मैन्युअल रूप से, जब mousekey दबाया जाता है

  • Top साथ स्थिति की तुलना करें , Left और Size प्रश्न में नियंत्रण के गुण।

  • तय करें कि आपको अपने माउस को कैप्चर करने वाले नियंत्रण को रोकने की आवश्यकता है या नहीं।

    public partial class Form1 : Form 
    { 
    private Point point; 
    private Boolean myCapture = false; 
    
    public Form1() 
    { 
        InitializeComponent(); 
    } 
    
    private void button1_MouseDown(object sender, MouseEventArgs e) 
    { 
        myCapture = true; 
    } 
    
    private void button1_MouseMove(object sender, MouseEventArgs e) 
    { 
        if (myCapture) 
        { 
         point = Cursor.Position; 
    
         if (!(point.X > button1.Left && point.X < button1.Left + button1.Size.Width && point.Y > button1.Top && point.Y < button1.Top + button1.Size.Height)) 
         { 
          button1.Capture = false; //this will release the capture and trigger the MouseLeave event immediately. 
          myCapture = false; 
         } 
        } 
    } 
    
    private void button1_MouseLeave(object sender, EventArgs e) 
    { 
        MessageBox.Show("Mouse leaving"); 
    } 
    

    }

निश्चित रूप से

आप MouseUp पर अपने ट्रैकिंग (myCapture=false;) को रोकने के लिए की जरूरत है। भूल है कि एक :)

+1

लेकिन अगर माउस पूरी खिड़की छोड़ देता है तो मुझे माउसलेव को उठाना होगा? मुझे लगता है कि माउस को विंडो से बाहर होने पर मुझे MouveMouve ईवेंट प्राप्त नहीं होंगे, इसलिए आपका MouseMove आधारित समाधान काम नहीं करेगा। या मैं गलत हूँ? – SiberianGuy

+0

@Idsa यह फॉर्म के लिए भी काम करता है। – dognose

+1

लेकिन हम यहां डब्ल्यूपीएफ के बारे में बात कर रहे हैं। मुझे संदेह है कि यह मेरे उत्तर को अपडेट करने के लिए WPF विंडो – SiberianGuy

2

जब मुझे माउस की घटनाएं नहीं मिलती हैं तो मुझे उम्मीद है कि मैं आमतौर पर स्नूप का उपयोग करके समझने में मदद करता हूं कि क्या हो रहा है।

1- Snoop (a WPF utility)
2- CodePlex project for Snoop

+3

यह वास्तव में प्रश्न का उत्तर नहीं देता है। –

1

और पूर्णता और ऐतिहासिक कारणों से (नहीं इनाम - यह भावना दो नकली सवालों होने नहीं है - तो आप शायद एक अगर बहुत देर नहीं में बढ़ना चाहिए) ...

मैं पूरी तरह से समाधान यहाँ global mouse hook का उपयोग कर (दृष्टिकोण 2)
WPF: mouse leave event doesn't trigger with mouse down

बनाया और इसके उपयोग को सरल बनाया - जैसे - आप अपनी व्यू-मॉडल में आदेश से जुड़ कर उपयोग कर सकते हैं वहाँ

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