繁体   English   中英

如果按住鼠标左键而不移动光标,则Window.DragMove()会导致窗口暂时冻结。

[英]Window.DragMove() causes the window to freeze temporarily if holding down the mouse left button without moving the cursor

我在WPF中有一个“无边界”窗口。 可以使用以下代码将其从不处理Click事件的窗口的任何部分拖动:

// Drag the window:
private void GlassWindow_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton != MouseButton.Left) return;
    if (AllowDrag) DragMove();
}

(注意:在这种情况下,AllowDrag始终设置为true)

这段代码可以正常工作,除了当我单击窗口并按住鼠标左键而不移动光标(=不拖动窗口)时 ,窗口冻结约2-3秒(即所有动画暂停,进度条停止)移动)。 此行为是一致的,并且当我单击按钮或拖动窗口时不会发生,只有当我按住鼠标左键时才发生。 有没有解决方案,或者这是预期的Windows行为?

编辑:不能解决问题的事情:

https://stackoverflow.com/a/3275712/2719183

https://stackoverflow.com/a/5494769/2719183

http://www.codeproject.com/Articles/11114

   if (AllowDrag) DragMove();

DragMove()是麻烦制造者,它使用一种非常怪异的方式来实现移动。 这就是导致您描述的问题的原因,WPF团队非常了解此问题,但选择不解决此问题。 您可以在此连接文章中阅读有关它的内容 如果您不满意,请投票。

因此,您需要避免DragMove() 最好的方法是按照通常的方式进行操作,这样可以最大程度地降低重现相同故障的风险。 这需要对winapi的工作方式有所了解。 每当单击窗口时,Windows都会发送WM_NCHITTEST消息,询问您的应用程序单击了窗口的哪个部分。 当您返回HTCAPTION时,即使您没有标题,Windows也照此行事,并实现您单击并拖动其标题的窗口时通常发生的情况。

这样做已经完成,您不必成为winapi的专家就可以做到这一点。 在谷歌“ wpf wm_nchittest”中找到代码。 最热门的是现有的SO问题 ,Tergiver的代码看起来不错。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM