[英]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
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.