2014-11-01 68 views
0

我有我訂閱的鼠標按下事件,當用戶點擊任何地方,甚至窗外的WPF窗口:的MouseDown事件停止射擊在WPF窗口

void RightClickWindow_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    try 
    { 
     base.OnMouseDown(e); 
     Point mousePositionInApp = Mouse.GetPosition(this); 
     Point mousePositionInScreenCoordinates = PointToScreen(mousePositionInApp); 
     if (mousePositionInScreenCoordinates.X < Left || mousePositionInScreenCoordinates.X > Left + Width || mousePositionInScreenCoordinates.Y < Top || mousePositionInScreenCoordinates.Y > Top + Height) 
     { 
      Close(); 
     } 
    } 
    catch { } 
} 

void RightClickWindow_Activated(object sender, EventArgs e) 
{ 
    Mouse.Capture(this, CaptureMode.SubTree); 
} 

如果點擊越界,我解僱了窗戶。除了我試圖修復但不知道如何修復的特殊情況外,這種方法效果很好。這裏是停止工作的地方:

我在XAML中有一個簡單的WPF Button。如果我用鼠標左鍵單擊此按鈕,並且在鼠標關閉的情況下,將光標拖出按鈕的邊界,然後釋放鼠標左鍵,這些捕獲事件不再觸發。爲什麼會這樣,我該如何修復我的代碼以適應這種特殊情況?

+0

你的意思是他們不會在你釋放按鈕的情況下觸發,或者他們不再觸發* ever *? – furkle 2014-11-01 19:25:40

+0

他們不再開火*永遠*。 – Alexandru 2014-11-01 19:27:15

+0

問題是您的Window失去了它的鼠標捕捉。爲了重現您的問題,我們還有其他方法,例如嘗試將窗口內的任何元素聚焦,然後嘗試在窗口外單擊,但不會按預期方式關閉,因爲它已丟失鼠標捕獲。我認爲你不應該嘗試做這樣的事情,它的行爲是非常不可靠的。當您的窗口始終有鼠標捕獲時,您無法正常處理標題欄(無法與其交互)。首先,您必須在窗口中集中某些元素才能拖動標題欄。然後窗口失去鼠標捕獲... – 2014-11-02 01:33:09

回答

1

當您單擊ButtonWindow失去了鼠標捕獲,這就是爲什麼MouseDown事件再也不會被調用的原因。關閉Deactivate事件應該適用於您的方案。

+1

只需重寫像這樣關閉的Deactivated事件就簡單多了。非常感謝!當然,我不得不添加一些併發檢查來確保窗口沒有通過重寫OnClosing事件而關閉,但是,它什麼都沒有。 :) – Alexandru 2014-11-03 01:48:46