2013-10-16 126 views
11

我使用PushFrame確保我的窗口在執行其他代碼之前完成繪圖。我的應用程序有一些時間敏感的功能,需要在我繼續執行代碼之前更新窗口。當用戶移動窗口時,PushFrame鎖定WPF窗口

所以我使用從MSDN樣本:http://msdn.microsoft.com/en-us/library/vstudio/system.windows.threading.dispatcher.pushframe(v=vs.110).aspx

除外,如果用戶被拖着窗口時,該代碼執行窗口掛起,你只能拿回來用CTRL-偉大的工程, ALT-DEL。

任何想法?

+0

聽起來很尷尬。你爲什麼不用'Dispatcher.BeginInvoke()'和適當的'DispatcherPriority'? –

+0

這是確保您在返回之前實際繪製到屏幕上的唯一方法。你知道開始調用是異步的嗎?如果我想要調用任何東西,但即使如此,您仍然從調度程序在自己的時間處理的實際繪製更新中抽象出來。 –

+0

不是真的。使用'DispatcherPriority.ApplicationIdle'保證你的代碼將在所有其他事情完成後被調用。順便說一句,「畫」這個詞聽起來太winforms了。你究竟在做什麼? –

回答

3

不幸的是,我沒有解決方案,但只能確認我們可以在我們的應用程序(以及50行示例程序)中重現這一點。 隨意投票for this connect issue.

4

的應用似乎凍結,因爲鼠標捕獲不會自動從窗口大小調整或DragMove()操作Dispatcher.PushFrame()從用戶代碼中調用後釋放。

的解決方法是手動從應用程序的任何窗口正在調用Dispatcher.PushFrame()之前捕獲鼠標釋放鼠標捕獲:

 ... 
     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() P /調用聲明:

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