2013-10-16 7 views
11

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

तो मैं MSDN से नमूना उपयोग कर रहा हूँ: http://msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher.pushframe(v=vs.110).aspx

कौन सा अच्छा काम करता है, को छोड़कर, एक उपयोगकर्ता जब इस कोड को खिड़की रुक जाता है निष्पादित करता है और आप केवल इसे वापस प्राप्त करने के लिए एक Ctrl- के साथ मेरी खिड़की खींच रहा है तो Alt-del।

कोई विचार?

+0

वास्तव में अजीब लगता है। आप उचित 'डिस्पैचर प्राथमिकता' के साथ 'डिस्पैचर.बिनगिनवोक() 'क्यों नहीं हैं? –

+0

यह गारंटी देने का एकमात्र तरीका है कि आप वास्तव में वापस आने से पहले स्क्रीन पर चित्रित कर चुके हैं। आप जानते हैं कि शुरूआत शुरूआत असीमित है? अगर कुछ भी मैं चाहता हूं कि Invoke, लेकिन इसके साथ भी आप वास्तविक पेंट अपडेट से अभी भी सारणित हैं कि प्रेषक अपने समय में संभालता है। –

+0

वास्तव में नहीं। 'DispatcherPriority.AplicationIdle' का उपयोग करके गारंटी देता है कि बाकी सब कुछ पूरा होने के बाद आपका कोड बुलाया जाएगा। बीटीडब्ल्यू शब्द "चित्रित" भी बहुत विनफॉर्म लगता है। आप वास्तव में क्या करने की कोशिश कर रहे हैं? –

उत्तर

3

दुर्भाग्यवश मेरे पास आपके लिए कोई समाधान नहीं है लेकिन केवल यह पुष्टि कर सकता है कि हम इसे अपने आवेदन (और 50 लाइन उदाहरण कार्यक्रम में) में भी पुन: उत्पन्न कर सकते हैं। वोट करने के लिए for this connect issue.

4

आवेदन freezed लगता स्वतंत्र महसूस Dispatcher.PushFrame() उपयोगकर्ता कोड से कहा जाता है के बाद, क्योंकि माउस पर कब्जा करने से विंडो आकार बदलने या DragMove() आपरेशन से जारी नहीं किया गया है।

[DllImport("user32.dll", CharSet = CharSet.Auto)] 
    public static extern IntPtr GetCapture(); 
:

 ... 
     if (priority < DispatcherPriority.Loaded) 
     { 
      IntPtr capturingHandle = GetCapture(); 
      for (int i = 0; i < Application.Current.Windows.Count; i++) 
      { 
       if (new WindowInteropHelper(
              Application.Current.Windows[i] 
              ).Handle == capturingHandle) 
       { 
        Mouse.Capture(
            Application.Current.Windows[i], 
            CaptureMode.Element 
           ); 
        Application.Current.Windows[i].ReleaseMouseCapture(); 
        break; 
       } 
      } 
     } 
     ... 

इस तरीके को GetCapture() पी/आह्वान घोषणा का इस्तेमाल करता है:

वैकल्पिक हल मैन्युअल आवेदन में किसी भी विंडो पहले Dispatcher.PushFrame() बुला करने के लिए माउस कैप्चर कर रहा है से माउस पर कब्जा जारी करने के लिए किया जाएगा

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