मैं माइक्रोसॉफ्ट ब्लेंड के साथ विंडोज प्रेजेंटेशन फाउंडेशन कंट्रोल का निर्माण कर रहा हूं।डब्ल्यूपीएफ मूसडाउन => कोई माउसलेव इवेंट
जब मैं बाएं माउस-बटन दबाकर अपना नियंत्रण छोड़ देता हूं, तो माउसलेव-इवेंट नहीं उठाया जाता है। क्यों नहीं?
मैं माइक्रोसॉफ्ट ब्लेंड के साथ विंडोज प्रेजेंटेशन फाउंडेशन कंट्रोल का निर्माण कर रहा हूं।डब्ल्यूपीएफ मूसडाउन => कोई माउसलेव इवेंट
जब मैं बाएं माउस-बटन दबाकर अपना नियंत्रण छोड़ देता हूं, तो माउसलेव-इवेंट नहीं उठाया जाता है। क्यों नहीं?
यह इरादा है व्यवहार:
यहाँ लिंक के एक जोड़े हैं जब आप किसी नियंत्रण पर 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;
) को रोकने के लिए की जरूरत है। भूल है कि एक :)
लेकिन अगर माउस पूरी खिड़की छोड़ देता है तो मुझे माउसलेव को उठाना होगा? मुझे लगता है कि माउस को विंडो से बाहर होने पर मुझे MouveMouve ईवेंट प्राप्त नहीं होंगे, इसलिए आपका MouseMove आधारित समाधान काम नहीं करेगा। या मैं गलत हूँ? – SiberianGuy
@Idsa यह फॉर्म के लिए भी काम करता है। – dognose
लेकिन हम यहां डब्ल्यूपीएफ के बारे में बात कर रहे हैं। मुझे संदेह है कि यह मेरे उत्तर को अपडेट करने के लिए WPF विंडो – SiberianGuy
जब मुझे माउस की घटनाएं नहीं मिलती हैं तो मुझे उम्मीद है कि मैं आमतौर पर स्नूप का उपयोग करके समझने में मदद करता हूं कि क्या हो रहा है।
यह वास्तव में प्रश्न का उत्तर नहीं देता है। –
और पूर्णता और ऐतिहासिक कारणों से (नहीं इनाम - यह भावना दो नकली सवालों होने नहीं है - तो आप शायद एक अगर बहुत देर नहीं में बढ़ना चाहिए) ...
मैं पूरी तरह से समाधान यहाँ
global mouse hook
का उपयोग कर (दृष्टिकोण 2)
WPF: mouse leave event doesn't trigger with mouse down
बनाया और इसके उपयोग को सरल बनाया - जैसे - आप अपनी व्यू-मॉडल में आदेश से जुड़ कर उपयोग कर सकते हैं वहाँ
में
... अधिक जानकारी के लिए अपने नियंत्रण के अंदर क्या है? मैं सोच रहा हूं कि ऐसा इसलिए है क्योंकि वस्तु (उदा।एक बटन) माउसडाउन इवेंट प्राप्त करने वाले आपके नियंत्रण में "माउस। आईस्केप्चर" को सही करने के लिए सेट किया गया है, इसलिए यह विशेष रूप से MouseEvents को संभालने में सक्षम है। – ASanch
यह सिर्फ एक सीमा, ग्रिड, छवि एक 2 लेबल है। क्या यह संभव है? –
हम एक ही समस्या का सामना कर रहे हैं (प्रश्न देखें: http://stackoverflow.com/questions/15970248/wpf-mouse-leave-event-doesnt-trigger-with-mouse-down)। इसलिए मैंने ध्यान आकर्षित करने के लिए यहां एक इनाम शुरू कर दिया है। – SiberianGuy