我有一个"无边框" 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
答案 0 :(得分:1)
if (AllowDrag) DragMove();
DragMove()
是麻烦制造者,它使用一种非常黑客的方式来实施此举。这导致了您描述的问题,WPF团队很清楚这个问题,但选择不修复它。您可以在this connect article中了解相关信息。如果你不满意,请投票。
所以你需要避免DragMove()
。最好的方法是按照正常完成的方式进行,最大限度地降低再现同样麻烦的风险。这需要了解一下winapi的工作方式。只要单击一个窗口,Windows就会发送WM_NCHITTEST
消息,询问您的应用程序单击了哪个窗口部分。当您返回HTCAPTION时,即使您没有标题,Windows也会接受您的说法,并实现当您按标题单击并拖动窗口时通常会发生的情况。
已经完成了,你不必成为winapi的专家就能实现这一目标。谷歌“wpf wm_nchittest”找到代码。最受欢迎的是existing SO question,Tergiver的代码看起来不错。