簡體   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