2013-10-16 7 views
11

Ich benutze PushFrame, um sicherzustellen, dass mein Fenster fertig gezeichnet wird, bevor zusätzlicher Code ausgeführt wird. Meine Anwendung hat einige zeitkritische Funktionen, die erfordern, dass die Fenster aktualisiert wurden, bevor ich weiter Code ausführe.PushFrame sperrt das WPF-Fenster, wenn der Benutzer das Fenster bewegt

ich die Probe von Msdn So verwenden: http://msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher.pushframe(v=vs.110).aspx

die großen Werke, mit der Ausnahme, wenn ein Benutzer mein Fenster schleppt, wenn dieser Code die Fenster hängt ausführt und Sie können es nur mit einem ctrl- zurück alt-del.

Irgendwelche Ideen?

+0

klingt wirklich peinlich. Warum machst du nicht einfach 'Dispatcher.BeginInvoke()' mit der richtigen 'DispatcherPriority'? –

+0

Das ist der einzige Weg zu garantieren, dass Sie tatsächlich auf den Bildschirm gemalt haben, bevor Sie zurückkehren. Sie wissen, dass Startaufruf asynchron ist? Wenn überhaupt, möchte ich Invoke aufrufen, aber selbst damit sind Sie immer noch von den tatsächlichen Paint-Updates, die der Dispatcher in seiner eigenen Zeit bearbeitet, abstrahiert. –

+0

nicht wirklich. Die Verwendung von 'DispatcherPriority.ApplicationIdle' garantiert, dass Ihr Code aufgerufen wird, nachdem alles andere abgeschlossen ist. Übrigens klingt das Wort "gemalt" auch nach Winforms. Was versuchst du eigentlich? –

Antwort

3

Leider habe ich keine Lösung für Sie, kann aber nur bestätigen, dass wir dies auch in unserer Anwendung (und in einem 50 Zeilen Beispielprogramm) reproduzieren können. Fühlen Sie sich frei Capture zu stimmen scheint freezed for this connect issue.

4

Die Anwendung, weil die Maus nicht automatisch aus dem Fenster Resize oder DragMove() Betrieb freigegeben wird, nachdem die Dispatcher.PushFrame() vom Benutzercode aufgerufen wird.

wäre dieses Problem umgehen, manuell von jedem Fenster in der Anwendung die Mausfreizugeben, die die Maus vor dem Aufruf Dispatcher.PushFrame() aufzeichnet:

 ... 
     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; 
       } 
      } 
     } 
     ... 

Diese Problemumgehung verwendet die GetCapture() p/aufrufen Erklärung:

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