2015-06-10 50 views
5

我正在WPF應用程序,其中我有一個窗口級別雙擊事件,當用戶雙擊事件時最大化應用程序窗口,點擊窗口內的任何地方。但是,我也在應用程序窗口中有一個自定義控件,並且在自定義控件中有一個單獨的雙擊事件。當用戶在自定義控件中雙擊時,只會觸發控件的雙擊事件,並且窗口不應調整大小。我的代碼看起來是這樣的:雙擊事件觸發窗口級別和控制級別,即使它在控制內處理

public class Window 
{ 
    private void window_DoubleClick(object sender, EventArgs e) 
    { 
     /// Maximize/minimize window 
    } 

    private void myCustomControl_DoubleClick(object sender, EventArgs e) 
    { 
     /// Do other things, but PLEASE don't resize! 
     e.Handled = true; 
    } 
} 

我的XAML看起來是這樣的:

<Window x:class="MyProject.MyWindow" 
    MouseDoubleClick="window_DoubleClick"> 
    <Grid Grid.Row="0" Margin="0"> 
     <local:myCustomControl 
      MouseDoubleClick="myCustomControl_DoubleClick"/> 
    </Grid> 
</Window> 

不幸的是,這段代碼的地點,當用戶雙擊在控制,控制事件發生火災,但Window事件也會發生。我已經嘗試在控件事件中設置e.Handled = true,但Window事件無論如何都會觸發。利用這一點,已經停止了窗口級別唯一雙擊從着火事件正在處理自定義控件的預覽雙擊事件:雖然預覽活動停止窗口中雙擊它可以發射前

private void myCustomControl_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 
} 

,我無法重構一小段代碼就無法使用它。我的自定義控件有幾個子控件也處理它的雙擊事件。如果預覽事件在父級控制級別被調用,那麼雙擊事件永遠不會通過子控件向下隧道,因此雙擊不會完成我想要的操作。如果可能的話,我想避免重構子控件中的任何代碼。這就是說,我的問題是這樣的:有沒有辦法阻止窗口級雙擊事件觸發一旦控件的雙擊事件已被處理?我一直在駕駛自己瘋狂試圖弄清楚這一點..任何幫助表示讚賞!

+1

請參閱[「應該在其標題中包含」標籤?「](http://meta.stackexchange.com/questions/19190/should-questions-include-tags-in-their-titles),其中共識是「不,他們不應該」! –

回答

2

問題是,MouseDoubleClick只顯示冒泡,但實際上沒有。從MSDN

雖然這個路由事件似乎遵循通過元素樹冒泡的路線,它實際上是沿各的UIElement元素樹引發的直接路由事件。如果在MouseDoubleClick事件處理程序中將Handled屬性設置爲true,則隨着將Handled設置爲false,沿路徑的後續MouseDoubleClick事件將發生。

相反,你可以使用MouseLeftButtonDown事件,並檢查使用clickCount:

private void myCustomControl_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    if (e.ClickCount == 2) 
    { 
     //do something 
     e.Handled = true; 
    } 
} 

注:這不會對MouseLeftButtonUp出於某種原因。

+0

感謝您的幫助!因爲我所有的自定義控件的子項都有與雙擊相關的事件,所以我選擇將窗口級事件處理程序更改爲MouseLeftButtonDown。它現在非常漂亮!再次感謝! – chelsea

+0

@chelsea不客氣!雙擊事件可能是一個痛苦的使用,所以我經常嘗試完全避免它。 –

+0

出於好奇,是否有任何文件說明爲什麼這個事件不會像其他泡沫一樣冒泡? MSDN文章沒有真正提供解釋爲什麼這樣做。 – chelsea

0

我會嘗試在您的窗口級別事件中爲您的自定義控件添加一個檢查。對發件人進行類型檢查,如果它與您的自定義控件相匹配就會退出。

+0

我已經嘗試過,看看會發生什麼。不幸的是,無論控件中是否出現雙擊,該類型總是看起來是應用程序窗口。 – chelsea

相關問題