的应用似乎冻结,因为鼠标捕获不会自动从窗口大小调整或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();
听起来很尴尬。你为什么不用'Dispatcher.BeginInvoke()'和适当的'DispatcherPriority'? –
这是确保您在返回之前实际绘制到屏幕上的唯一方法。你知道开始调用是异步的吗?如果我想要调用任何东西,但即使如此,您仍然从调度程序在自己的时间处理的实际绘制更新中抽象出来。 –
不是真的。使用'DispatcherPriority.ApplicationIdle'保证你的代码将在所有其他事情完成后被调用。顺便说一句,“画”这个词听起来太winforms了。你究竟在做什么? –