2013-10-16 77 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();