2011-06-15 22 views
5

मैं एक बड़े एप्लिकेशन पर काम कर रहा हूं और इसमें कुछ ड्रैग/ड्रॉप कार्यक्षमता जोड़ रहा हूं। विशेष रूप से, मैं फ़ाइल को खोलने के लिए उपयोगकर्ता को मुख्य विंडो में फ़ाइल खींचने और छोड़ने की अनुमति दे रहा हूं।डायलॉग बॉक्स खोलने पर ड्रैग/ड्रॉप को अक्षम कैसे करें

समस्या यह है कि ड्रैग/ड्रॉप ऑपरेशन तब भी होने की अनुमति है जब मुख्य विंडो एक संवाद बॉक्स प्रदर्शित कर रही हो (उदाहरण के लिए, वर्तमान में खुली फ़ाइल में किसी आइटम के लिए गुण विंडो)। यदि मुख्य विंडो एक मोडल संवाद बॉक्स प्रदर्शित कर रही है तो मैं इसे होने की अनुमति नहीं दूंगा। ऐसा इसलिए है क्योंकि डायलॉग बॉक्स खुला होने पर एप्लिकेशन में नई फ़ाइल लोड करना शायद प्रोग्राम को क्रैश करेगा: डायलॉग बॉक्स को कॉल करने वाला कोड ओपन फाइल को बदलने की उम्मीद नहीं करता है जबकि डायलॉग बॉक्स खुलता है (यही कारण है कि डायलॉग बॉक्स मोडल था ...)।

मुख्य एप्लिकेशन सी ++ में लिखा गया है, लेकिन मैं एक सी # नमूना पोस्ट कर रहा हूं। दोनों प्लेटफार्मों पर लक्षण/व्यवहार समान है, लेकिन मैं इसे सी # के साथ बहुत कम कोड में प्रदर्शित कर सकता हूं। मैं दोनों भाषाओं/प्लेटफार्मों से बहुत परिचित हूं इसलिए मैं आवश्यकतानुसार उपयुक्त भाषा के किसी भी उत्तर का अनुवाद कर सकता हूं।

मेरे नमूना कोड के साथ समस्या का प्रदर्शन करने के लिए, निम्न C# कोड संकलित करें और चलाएं। यह एक "मुख्य विंडो" बनाएगा जो वैध ड्रॉप लक्ष्य है। विंडोज एक्सप्लोरर से मुख्य विंडो पर फ़ाइल खींचें और छोड़ें: आपको "गिराए गए" संदेश बॉक्स को देखना चाहिए। अब, एक संवाद बॉक्स पॉप अप करने के लिए फॉर्म पर बटन क्लिक करें। फिर, संवाद बॉक्स खोलने पर फ़ाइल को मुख्य विंडो पर खींचने और छोड़ने का प्रयास करें। ध्यान दें कि एक मोडल संवाद बॉक्स खुला होने के बावजूद ड्रॉप की अनुमति है। जब संवाद खुला होता है तो मैं इसे कैसे रोक सकता हूं?

स्पष्ट उत्तर अस्थायी रूप से संवाद बॉक्स खोलते समय अस्थायी रूप से AllowDrop को झूठा सेट करना है। समस्या यह है कि मुख्य आवेदन बहुत बड़ा है और इसलिए कई जगहें हैं जो संवाद बॉक्स खोलती हैं। एक संवाद खोलने वाले प्रत्येक स्थान को ढूंढना मुश्किल होगा और यह कोड जोड़ें। इसके अलावा, यहां प्रत्येक डेवलपर को प्रत्येक बार जब वे एक मोडल विंडो खोलते हैं तो यह क्रिया करने के लिए जानना होगा; यह असंभव है कि हर कोई याद रखेगा। मुझे चिंता है कि यह एक बहुत अच्छा समाधान नहीं है।

निश्चित रूप से ऐसा करने की एक और अधिक रखरखाव विधि है जिसके लिए एक संवाद खोले जाने वाले हर स्थान में कोड जोड़ने की आवश्यकता नहीं है?

using System; 
using System.Windows.Forms; 
using System.Drawing; 

public class MyDialog : Form { 
    public MyDialog() { 
     Text = "MyDialog"; 
    } 
} 
public class MainForm : Form { 
    public MainForm() { 
     Button btn = new Button(); 
     btn.Location = new Point(0, 0); 
     btn.Text = "ShowDialog"; 
     btn.Size = new Size(75, 23); 
     btn.Click += new EventHandler(GoToDialog); 

     this.AllowDrop = true; 
     this.Controls.Add(btn); 
     this.Text = "Drop Target"; 
     this.DragDrop += new DragEventHandler(this.MyDragDrop); 
     this.DragEnter += new DragEventHandler(this.MyDragEnter); 
    } 
    private void MyDragDrop(object sender, DragEventArgs e) { 
     MessageBox.Show("dropped"); 
    } 
    private void MyDragEnter(object sender, DragEventArgs e) { 
     e.Effect = DragDropEffects.Copy; 
    } 
    private void GoToDialog(object sender, EventArgs e) { 
     using (MyDialog ab = new MyDialog()) { 
      ab.ShowDialog(this); 
     } 
    } 
} 
static class Program { 
    [STAThread] 
    static void Main() { 
     Application.Run(new MainForm()); 
    } 
} 
+0

आप '' MyDragDrop' या 'MyDragEnter' तरीकों की शुरुआत में एक सशर्त जांच के आधार पर return' किया जा सका और बस की जाँच करता है, तो एक संवाद दिखा रहा है? – Robb

+0

यदि मेरे पास कोई ऐसा फ़ंक्शन था जो यह निर्धारित कर सकता है कि कोई संवाद दिखा रहा है, तो मैं ड्रैगड्रॉफ़्रेट वापस कर सकता हूं। यदि कोई संवाद हुआ तो DragEnter ईवेंट में कोई नहीं। लेकिन मुझे इस तरह के किसी भी समारोह की जानकारी नहीं है - अगर इसके लिए एक एपीआई मौजूद है तो मुझे इसके बारे में जानना अच्छा लगेगा! –

+0

यह साइट: http://hashfactor.wordpress.com/2009/01/28/c-check-if-a-form-is-already-opened/ मैं खोद सकता हूं। सौभाग्य! – Robb

उत्तर

2

मुझे यकीन नहीं है कि चीजें सी # में कैसे काम करती हैं, इसलिए मुझे यह बताएं कि यह उत्तर गलत है या नहीं। सी ++ एमएफसी में, जब एक संवाद प्रदर्शित होता है तो मुख्य विंडो अक्षम होती है। आप यह देखने के लिए परीक्षण कर सकते हैं कि मुख्य विंडो अक्षम है या नहीं, तो ड्रॉप को अनदेखा करें।

private void MyDragDrop(object sender, DragEventArgs e) { 
    if (CanFocus) 
     MessageBox.Show("dropped"); 
} 
private void MyDragEnter(object sender, DragEventArgs e) { 
    if (CanFocus) 
     e.Effect = DragDropEffects.Copy; 
    else 
     e.Effect = DragDropEffects.None; 
} 
+0

"CanFocus" के साथ "IsEnabled" को बदलें और यह कोड नमूना पूरी तरह से काम करता है! उन लोगों के लिए जो .NET का उपयोग नहीं कर रहे हैं, CanFocus IsWindowEnabled (HWND) API कॉल के आस-पास बस एक साधारण आवरण है। जैसा कि उत्तर दिखाता है, यह निर्धारित करते समय हमेशा यह जांचें कि ड्रैग/ड्रॉप मान्य है या नहीं। Http://msdn.microsoft.com/en-us/library/ms646303%28VS.85%29.aspx और http://msdn.microsoft.com/en-us/library/system.windows.forms.control देखें .canfocus.aspx –

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